2010-10-28 5 views
1

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

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."); 
     } 
    } 
} 

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

+0

Программа существует, как правило, без вмешательства? Что произойдет, если вы не сделаете phil.start? – TofuBeer

+1

Что заставляет Философские потоки окончательно прекратиться? Как программа фактически перестает работать? Являются ли вилки ограниченными ресурсами? – Affe

ответ

1

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

EDIT

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

// 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. 
} 
+0

Прошу прощения, я пытался удалить как можно больше кода, чтобы было легче читать, и случайно удалил эту строку. Я добавляю к списку в моей программе, и он все еще не работает. – OogaBooga

+0

См. Мое последнее редактирование. – Adamski