2009-10-08 100 views
1

最近我瞭解了這個Java 1.5的功能,並開發了一個示例代碼來使用它。我的目標是在由於未捕獲的異常而死的時候重新啓動線程。有效使用UncaughtExceptionHandler

public class ThreadManager { 

    public static void main(String[] args) throws InterruptedException { 
     startThread(); 
    } 

    public static void startThread(){ 
     FileReaderThread reader = new FileReaderThread("C:\\Test.txt"); 
     Thread thread = new Thread(reader); 
     thread.setUncaughtExceptionHandler(new CustomExceptionHandler()); 
     thread.start(); 
    } 
} 

這裏的文件閱讀器只是包含一個例程來讀取文件和打印內容。我正在模擬一個未捕獲的異常,在該類中使文件名爲null。

然後我的CustomExceptionHandler類如下。

public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler { 

    public void uncaughtException(Thread t, Throwable e) { 
     ThreadManager.startThread(); 
    } 
} 

但是在這裏我觀察到一個問題。在未捕獲的異常之後,線程處於睡眠狀態。我通過使用分析器來驗證它。因此,創建新線程會隨着時間的流逝而填補我的記憶。使system.gc()後跟t = null不起作用。

那麼建議您處理這種情況的最佳方法是什麼?我只是需要一個新的線程,我不希望任何舊的線程更多....

感謝

+0

我剛剛測試了您的代碼,但看不到任何奇怪的行爲,因爲您描述了它(我正在使用JDK6)。 – sfussenegger 2009-10-08 06:42:40

+0

您是否嘗試通過調用'uncaughtException'方法中的't.stop()'來停止線程?儘管Thread.stop()已被棄用。 – Amarghosh 2009-10-08 06:42:49

+0

@sfussenegger:是的..你在功能上看不到任何問題。您只能通過探查器查看它。影響只是在使用的內存。 :) – 2009-10-08 06:45:48

回答

4

的方法,我建議是不要讓異常泄漏你的線程。未捕獲的異常處理程序是一個漂亮的工具,但是,如果您正在使用它來確保您的線程正在運行,那麼我建議您有設計或代碼問題。你的線程正在死於一次可怕的死亡,而忽略這一點,並且重新啓動一個新的線程可能不是你想要做的,即使你能夠找出睡眠線程問題。

想象一下,不是在你的線程中,問題出在你的main()方法 - 你會讓相同的異常泄漏出來並殺死你的應用程序嗎?如果不是,你會怎麼做來緩解這個問題?你不會再寫一個異常處理程序,它再次調用main()對不對?無論你會做什麼,這是你應該在你的線程中做的。

+0

+1,不要讓你的程序在一個未知的狀態下執行,在一個意外錯誤之後盲目前進! – bobbymcr 2009-10-08 07:03:22

1

您不應該重新啓動即將退出的線程。當給定線程終止時調用方法。所以你只能創建並啓動一個新的線程。如果您知道線程類(通過instanceof ...),則可以從中獲取可運行的線程,並在終止線程組中創建一個新線程,並從UncaughtExceptionHandler中啓動它。

但知道:我會檢查特定的例外情況。最小值可以是:僅當throwable是運行時異常時才重新啓動,而不是錯誤!

相關問題