在发现在 Java 1.6(以及来自 Eclipse)中FutureTask
运行会吞下方法中的异常后,我试图想出一种方法来捕获这些异常,而无需在我的所有实现中添加 throw/catch。Executors.newCachedThreadPool()
Runnable.run()
Runnable
API 建议重写FutureTask.setException()
应该对此有所帮助:
导致此 Future 报告一个 ExecutionException,并将给定的 throwable 作为其原因,除非此 Future 已被设置或已被取消。此方法在计算失败时由 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
,有什么原因吗?