我有一個多線程程序,其中有一個線程可以監視多個線程。該功能是這樣設計的: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()代替。看來我無法在父線程或本身中覆蓋它。這太令人沮喪了。我正在考慮將條目放入隊列中,並在其他地方閱讀。至少可以工作。
哦,整個目的是爲了確保如果任何線程因爲運行時異常而死掉,監視器線程將檢查異常是否足夠致命,並決定重新啓動該線程或完全退出。同時,我希望程序正常結束(中斷髮送給保護程序線程,以便將結果轉儲出來,然後中斷回來,告訴我們已準備好退出)。