Проблемы с завершением работы Java - PullRequest
1 голос
/ 28 октября 2010

Мои выключатели не будут работать.Хук завершения работы предназначен для распечатки статистики после завершения программы для всех запущенных потоков философии.Философский класс расширяет Thread и просто жует и ест в зависимости от того, доступны ли вилки или нет.Вот мой код.

public class Main {
    private static ArrayList<Philosopher> philosophers = new ArrayList<Philosopher>();

public static void main(String[] args) {
    int counter = 0;
    int num = Integer.parseInt(args[0]); // number of philosopher threads to create
    for(int x = 0; x < num; x++)
    {
        Fork one = new Fork(counter);
        counter++;
        Fork two = new Fork(counter);
        counter++;
        Philosopher p = new Philosopher(String.valueOf(x), one, two); // (Identifier, fork one, fork two)
        philosophers.add(p);
    }

    // Create shutdown hook
    Stats s = new Stats(philosophers);
    Runtime.getRuntime().addShutdownHook(s);

    // Start all philosopher threads
    for(Philosopher phil : philosophers)
    {
        phil.start();
    }
}
}


public class Stats extends Thread{
    private ArrayList<Philosopher> list = new ArrayList<Philosopher>();

    public Stats(ArrayList<Philosopher> al)
    {
        list = al;
    }

    public void run()
    {
        System.out.println("Test");
        for(Philosopher p : list)
        {
            System.out.println(p.getPhilName() + " thought for " + p.getTimeThinking() + " milliseconds and chewed for " + p.getTimeChewing() + " milliseconds.");
        }
    }
}

Спасибо за любую помощь, которую вы можете оказать, я очень благодарен.

1 Ответ

1 голос
/ 28 октября 2010

Вы создаете Philosopher экземпляров, но не добавляете их в list, следовательно, список остается пустым, и ваш отключающий хук, кажется, не запускается, потому что он ничего не печатает на стандартный вывод.

РЕДАКТИРОВАТЬ

После вашего последнего комментария я бы предложил добавить запись в журнал, чтобы доказать, что все потоки заканчиваются.Например, вы можете присоединиться к каждому философскому потоку из основного потока, чтобы при завершении основного потока вы были уверены, что каждый философский поток ранее завершился.

  // Start all philosopher threads
  for (Philosopher phil : philosophers) {
    phil.start();
  }

  for (Philosopher phil : philosophers) {
    System.err.println("Joining with thread: " + phil.getName());
    phil.join();
  }

  System.err.println("Main thread terminating.");
  // Shut-down hook should now run.
}
...