我在java中編寫了一些代碼,將異常從線程推送到主線程,方法是將它們排入一個包裝(單獨的類)中。現在,如果包裝中存在任何異常,則線程會死亡。然後必須在主線程上拋出異常。似乎沒有在主線程上調用的標準java事件,所以我必須在某個線程上使用連接函數。我不能在主線程中使用連接,因爲那時主線程會阻塞。我不能在另一個線程中使用它,那麼我不能再拋出異常。我想不出任何其他方式在主線程上拋出異常。這裏的任何人有一個想法?線程中的Java異常
回答
正如@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!
使用ExecutorService進行線程處理,並使用Future.get()來獲取已執行任務的結果和/或發生的任何異常。
可以請你發表一個例子嗎?我不明白主線程如何通過調用'future.get'函數來阻止。 –
@niomaster:我不確定我瞭解你的主線程在做什麼。如果要檢查任務的狀態而不阻塞,請使用[Future.isDone()](http://download.oracle)。com/javase/6/docs/api/java/util/concurrent/Future.html#isDone%28%29)。 –
使用ExecutorService執行線程和Future.get()以獲取已執行任務的結果和/或發生的任何異常。
- 1. java中的異常線程
- 2. java線程異常
- 3. Java線程中斷異常
- 4. 異常在Java線程
- 5. Java異常線程EOFException
- 6. Java:數組異常線程
- 7. 線程「主」異常java.lang.NullPointerException [java]
- 8. 線程中的Java異常java.util.NoSuchElementException
- 9. 線程「main」中的異常java.lang.IndexOutOfBoundsException - Java
- 10. Java在線程「main」中的異常java.lang.NullPointerException
- 11. 線程錯誤中的Java異常
- 12. Java:線程「main」中的異常java.lang.NullPointerException
- 13. Java「線程中的異常」main「java.lang.NoClassDefFoundError」
- 14. Java - 線程「main」中的異常java.util.ConcurrentModificationException
- 15. java:線程「main」中的異常java.lang.NoClassDefFoundError:Chain_of_Responsibility
- 16. 線程「main」中的Java異常java.util.UnknownFormatConversionException:Conversion =' - '
- 17. Java異常中的線程「AWT-EventQueue-0」
- 18. 線程「main」中的異常java
- 19. 主線程中的Java異常 - ClassNotFoundException
- 20. Java:「線程主java.lang.nullpointerexception中的異常」
- 21. 如何在線程「AWT-EventQueue-0」中的線程「TimerQueue」異常中解決異常像java中的java.lang.IllegalMonitorStateException異常?
- 22. 異常線程「main」在java中
- 23. 線程異常異常
- 24. 線程「線程1」中的異常java.util.ConcurrentModificationException
- 25. Java的:異常在線程 「主要」 java.lang.NoClassDefFoundError
- 26. 線程「主」中的異常
- 27. 線程「main」中的異常
- 28. 線程中的異常,java.lang.NullPointerException
- 29. 線程中的異常主
- 30. 線程中的phantomjs異常
你可以發佈一些示例代碼來說明問題嗎?乍一看,你似乎正在捕獲包裝線程的run()方法中的異常。在該異常處理程序中,您可以將異常傳遞給主線程中的某個方法。 –