2010-02-26 45 views
3

我有一個多線程程序,其中有一個線程可以監視多個線程。該功能是這樣設計的:addShutdownHook和setUncaughtExceptionHandler在java中無法正常工作

主要程序不啓動,並開始看守主題,在無效的主要(),我也行

Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownThread(), "Exit Listener")); 

當我不啓動觀察者線程,該ShutdownThread是當我終止程序時調用,但是當我啓動Watcher線程時,它有一個死循環,ShutdownThread不叫(我在該線程中打印出一條消息)。這非常奇怪。任何解釋?

。觀察者線程是這樣的:

public void run(){ 
    boolean running=false; 
    thread a=new thread(...); //Do the same thing for b, c, d... 
    while(true){ 
    if (a.isActive()){ 
    if (running) 
     thread a= new thread(...); 
    a.start(); 
    running=true; 
    } 
    Thread.sleep(1000); //try catch block... 
} 

我想是正常關機,即在得到一個終止信號,shutdownThread運行時,設置一個標誌,並中斷所有線程,等待線程中斷它,或者它超時,以便剩下的線程可以被終止。所有線程都可以捕獲中斷,並檢查是否設置了標誌,如果置位,它將中斷shutdownThread,然後退出。相反,我所看到的是所有的線程都是自行終止的,根本就不做清理。

如何使用信號?有沒有什麼好的跨平臺代碼?

然後,setUncaughtExceptionHandler也不起作用。我做了測試,發現處理程序根本沒有被調用。我不知道爲什麼。該處理程序的代碼是:

public static class ErrHandler implements Thread.UncaughtExceptionHandler{ 
    public final void uncaughtException(Thread t, Throwable e) { 
      Error(t + "died, threw exception: " + e); 
     } 
    }//this is in public class globals 

我使用

producer.setUncaughtExceptionHandler(Globals.errhandler); 

是在我的代碼鉤住它,我只看到原來e.printStack()代替。看來我無法在父線程或本身中覆蓋它。這太令人沮喪了。我正在考慮將條目放入隊列中,並在其他地方閱讀。至少可以工作。

哦,整個目的是爲了確保如果任何線程因爲運行時異常而死掉,監視器線程將檢查異常是否足夠致命,並決定重新啓動該線程或完全退出。同時,我希望程序正常結束(中斷髮送給保護程序線程,以便將結果轉儲出來,然後中斷回來,告訴我們已準備好退出)。

回答

0

不知道它是否對你有幫助,但是我們遇到了同樣的問題。 並非所有異常都正確地路由到註冊的ExceptionHandler。

我不知道單元測試是否存在併發框架。因爲這必須被檢測到。

我們通過使用ScheduledExecutorService實例作爲委託來實現ScheduledExecutorService,並將每個方法的參數Runnable/Callable封裝在可修正行爲的Runnable/Callable實現中。