處理執行緒拋出的例外狀況
在多執行緒應用程式中,處理主執行緒中子執行緒拋出的例外狀況至關重要。考慮以下場景:
<br>public class Test extends Thread {<br> public static void main(String[] args) throws InterruptedException {<pre class="brush:php;toolbar:false">Test t = new Test(); try { t.start(); t.join(); } catch (RuntimeException e) { System.out.println("** RuntimeException from main"); } System.out.println("Main stoped");
@Override
public void run() {
try { while (true) { System.out.println("** Started"); sleep(2000); throw new RuntimeException("exception from thread"); } } catch (RuntimeException e) { System.out.println("** RuntimeException from thread"); throw e; } catch (InterruptedException e) { }
}
}
在此範例中,子執行緒中引發的例外不會傳播到主執行緒。這是因為 Java 不會自動將執行緒中拋出的例外狀況與主執行緒中的處理程序關聯起來。
解決方案:Thread.UncaughtExceptionHandler
要處理執行緒中的異常,需要一可以使用 Thread.UncaughtExceptionHandler。此介面提供了 uncaughtException() 方法,當執行緒中發生未捕獲的異常時,該方法將被呼叫。
Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread th, Throwable ex) { System.out.println("Uncaught exception: " + ex); } }; Thread t = new Thread() { @Override public void run() { System.out.println("Sleeping ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted."); } System.out.println("Throwing exception ..."); throw new RuntimeException(); } }; t.setUncaughtExceptionHandler(h); t.start();
透過將 uncaughtExceptionHandler 設定到線程,任何未捕獲的異常都將由提供的實作處理。這允許主線程優雅地捕獲和處理異常,確保正確的處理和錯誤報告。
以上是Java中如何處理子執行緒拋出的例外狀況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!