Java 1.6(およびEclipseから)でFutureTask
実行するとメソッドの例外が飲み込まれることがわかった後、すべての実装にthrow/catchを追加せずにこれらをキャッチする方法を考え出そうとしました。Executors.newCachedThreadPool()
Runnable.run()
Runnable
FutureTask.setException()
APIは、オーバーライドがこれに役立つはずであることを示唆しています。
このFutureがすでに設定されているかキャンセルされていない限り、このFutureは、指定されたthrowableを原因としてExecutionExceptionを報告します。このメソッドは、計算が失敗したときにrunメソッドによって内部的に呼び出されます。
ただし、このメソッドは呼び出されていないようです(デバッガーで実行すると、例外がによってキャッチされますが、FutureTask
呼び出さsetException
れません)。問題を再現するために、次のプログラムを作成しました。
public class RunTest {
public static void main(String[] args) {
MyFutureTask t = new MyFutureTask(new Runnable() {
@Override
public void run() {
throw new RuntimeException("Unchecked exception");
}
});
ExecutorService service = Executors.newCachedThreadPool();
service.submit(t);
}
}
public class MyFutureTask extends FutureTask<Object> {
public MyFutureTask(Runnable r) {
super(r, null);
}
@Override
protected void setException(Throwable t) {
super.setException(t);
System.out.println("Exception: " + t);
}
}
私の主な質問は、FutureTaskでスローされた例外をキャッチするにはどうすればよいですか?なぜsetException
呼ばれないのですか?
Thread.UncaughtExceptionHandler
また、なぜこのメカニズムが使用されていないのか知りたいのFutureTask
ですが、理由はありますか?