2011-07-31 156 views
2

我在java中編寫了一些代碼,將異常從線程推送到主線程,方法是將它們排入一個包裝(單獨的類)中。現在,如果包裝中存在任何異常,則線程會死亡。然後必須在主線程上拋出異常。似乎沒有在主線程上調用的標準java事件,所以我必須在某個線程上使用連接函數。我不能在主線程中使用連接,因爲那時主線程會阻塞。我不能在另一個線程中使用它,那麼我不能再拋出異常。我想不出任何其他方式在主線程上拋出異常。這裏的任何人有一個想法?線程中的Java異常

+0

你可以發佈一些示例代碼來說明問題嗎?乍一看,你似乎正在捕獲包裝線程的run()方法中的異常。在該異常處理程序中,您可以將異常傳遞給主線程中的某個方法。 –

回答

0

正如@Ryan Stewart所說,您可以使用Executros框架。在這種情況下,你不會自己創建線程:兄弟可以幫助你做到這一點。您可以使用Callable而不是Runnable來實現您的邏輯。在這種情況下,你可以得到Future並詢問線程的狀態。

不幸的是,恐怕這隻能部分幫助你,因爲你必須積極地致電Future。

如果我正確地理解了你,你希望你的主線程在異常拋出時由一個工具線程通知。我不認爲你應該從工作者線程中得到異常,並在主線程中重新拋出它。

我建議您使用以下策略之一。

A.使用監聽模式。創建

interface ExceptionListener { 
    public void exceptionThrown(Exception e); 
} 

創建abstract class ExceptionNotifierThread extends Thread。 該類將收集ExceptionListener和方法addExceptionListener(ExceptionListener l)

線程的方法run()將捕獲所有異常,然後調用循環中的所有exceptiton偵聽器。

現在你在創建線程之前,在調用它的start()方法之前,你可以註冊爲一個excption偵聽器。

就是這樣。當線程拋出異常時,你的監聽器將被回調。

B.這是同一解決方案的一個版本。而不是同步通知聽衆線程我的推擠excption隊列和每個人都可以從隊列中讀取它。用戶執行者和阻塞隊列。

祝你好運,歡迎來到stackoverflow!

3

使用ExecutorService進行線程處理,並使用Future.get()來獲取已執行任務的結果和/或發生的任何異常。

+0

可以請你發表一個例子嗎?我不明白主線程如何通過調用'future.get'函數來阻止。 –

+0

@niomaster:我不確定我瞭解你的主線程在做什麼。如果要檢查任務的狀態而不阻塞,請使用[Future.isDone()](http://download.oracle)。com/javase/6/docs/api/java/util/concurrent/Future.html#isDone%28%29)。 –

1

使用ExecutorService執行線程和Future.get()以獲取已執行任務的結果和/或發生的任何異常。

相關問題