先日、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]