天天看點

捕獲Java線程池執行任務抛出的異常

捕獲Java線程池執行任務抛出的異常

Java中線程執行的任務接口java.lang.Runnable 要求不抛出Checked異常,

  public interface Runnable {

  public abstract void run();

  }

  那麼如果 run() 方法中抛出了RuntimeException,将會怎麼處理了?

  通常java.lang.Thread對象運作設定一個預設的異常處理方法:

  java.lang.Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)

   而這個預設的靜态全局的異常捕獲方法時輸出堆棧。

  當然,我們可以覆寫此預設實作,隻需要一個自定義的java.lang.Thread.UncaughtExceptionHandler接口實作即可。

  public interface UncaughtExceptionHandler {

  void uncaughtException(Thread t, Throwable e);

  而線上程池中卻比較特殊。預設情況下,線程池 java.util.concurrent.ThreadPoolExecutor 會Catch住所有異常, 當任務執行完成(java.util.concurrent.ExecutorService.submit(Callable))擷取其結果 時(java.util.concurrent.Future.get())會抛出此RuntimeException。

<a href="http://blog.sina.com.cn/s/blog_8839cbea0101f5wa.html">http://blog.sina.com.cn/s/blog_8839cbea0101f5wa.html</a>