ExecutorService之submit與execute

541732025發表於2013-05-28
ExecutorService的submit與execute方法都能執行任務,但在使用過程,發現其對待run方法丟擲的異常處理方式不一樣。
兩者執行任務最後都會透過Executor的execute方法來執行,但對於submit,會將runnable物件包裝成FutureTask,其run方法會捕捉被包裝的Runnable Object的run方法丟擲的Throwable異常,待submit方法所返回的的Future Object呼叫get方法時,將執行任務時捕獲的Throwable Object包裝成java.util.concurrent.ExecutionException來丟擲。

而對於execute方法,則會直接丟擲異常,該異常不能被捕獲,想要在出現異常時做些處理,可以實現Thread.UncaughtExceptionHandler介面:

點選(此處)摺疊或開啟

  1. class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
  2.  public void uncaughtException(Thread t, Throwable e) {
  3.  System.out.println(\"caught \"+e);
  4.  }
  5. }

  6. class HandlerThreadFactory implements ThreadFactory{
  7.  public Thread newThread(Runnable r) {
  8.  Thread t=new Thread(r);
  9.  t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
  10.  return t;
  11.  }
  12. }

  13. ExecutorService exec=Executors.newCachedThreadPool(new HandlerThreadFactory())

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-762175/,如需轉載,請註明出處,否則將追究法律責任。

相關文章