2010-10-28 151 views
1

我的關機掛鉤不會運行。關閉鉤子用於在程序終止後爲所有正在運行的哲學家線程輸出統計信息。哲學家課程擴展了線程,並且基於叉子是否可用而簡單地咀嚼和吃飯。這是我的代碼。Java關機掛鉤問題

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 2010-10-28 16:22:12

+1

什麼導致哲學家線程最終終止?程序如何實際停止運行?分叉是有限的資源嗎? – Affe 2010-10-28 16:22:21

回答

1

您正在創建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. 
} 
+0

我很抱歉,我試圖刪除儘可能多的代碼,以便於閱讀,並且意外刪除了該行。我正在添加到我的程序列表中,但它仍然無法正常工作。 – OogaBooga 2010-10-28 16:09:59

+0

看到我最新的編輯。 – Adamski 2010-10-28 22:36:00