ExecutorService使用時の例外捕捉

先日、Java サブスレッドで発生する例外の捕捉を書いたので、ExecutorService を使用した時の方法を、
サンプルとして書く。

まず、スレッドプールに載せるスレッドのクラス、、

public class MyTask implements Runnable{
   @Override
   public void run(){
      try{
      System.out.println("Hello! - "+ Thread.currentThread().getId());
      
      Thread.sleep(1 * 1000);
      
      System.out.println("Hello! - "+ Thread.currentThread().getId()+" End");
      
      throw new RuntimeException(
"MyTask  RuntimeException !! "+Thread.currentThread().getId());

      
      }catch(InterruptedException e){
         e.printStackTrace();
      }
   }
}

ExecutorService 生成で、java.util.concurrent.ThreadFactory として Thread.UncaughtExceptionHandler
任意に実装させてスレッドプールを作成する。
-----------------------
ExecutorService exec = Executors.newFixedThreadPool(3,new ThreadFactory(){
   @Override
   public Thread newThread(Runnable r){
      return new Thread(r,"a"){
         @Override
         public UncaughtExceptionHandler getUncaughtExceptionHandler(){

            return new Thread.UncaughtExceptionHandler(){
               @Override
               public void uncaughtException(Thread t,Throwable e){

                  System.out.println("## ["+t.getName()+"-"+t.getId()
                        +"] "+e.getClass().getName()
                        +" ["+e.getMessage()+"]");
               }
            };
         }
      };
   }
});
for(int i=0;i<10; i++){
   System.out.println("set "+i);
   exec.execute(new MyTask());
}
System.out.println("main waite! ");
-----------------------
実行すると以下のように標準出力が得られる。

set 0
set 1
Hello! - 8
set 2
Hello! - 9
set 3
set 4
Hello! - 10
set 5
set 6
set 7
set 8
set 9
main waite!
Hello! - 8 End
Hello! - 10 End
Hello! - 9 End
Hello! - 11
## [a-8] java.lang.RuntimeException [MyTask RuntimeException !! 8]
## [a-10] java.lang.RuntimeException [MyTask RuntimeException !! 10]
## [a-9] java.lang.RuntimeException [MyTask RuntimeException !! 9]
Hello! - 11 End
## [a-11] java.lang.RuntimeException [MyTask RuntimeException !! 11]
Hello! - 12
Hello! - 12 End
## [a-12] java.lang.RuntimeException [MyTask RuntimeException !! 12]
Hello! - 13
Hello! - 13 End
## [a-13] java.lang.RuntimeException [MyTask RuntimeException !! 13]
Hello! - 14
Hello! - 14 End
## [a-14] java.lang.RuntimeException [MyTask RuntimeException !! 14]
Hello! - 15
Hello! - 15 End
## [a-15] java.lang.RuntimeException [MyTask RuntimeException !! 15]
Hello! - 16
Hello! - 16 End
## [a-16] java.lang.RuntimeException [MyTask RuntimeException !! 16]
Hello! - 17
Hello! - 17 End
## [a-17] java.lang.RuntimeException [MyTask RuntimeException !! 17]