在发现在Java1.6(和Eclipse中)的Executors.newCachedThreadPool()中运行的FutureTask允许Runnable.run()方法中的异常后,我尝试想出一种方法来捕获这些异常,而无需向我所有的Runnable实现添加抛出/捕捉。
应用程序接口建议覆盖FutureTask.setException()应该在这方面有所帮助:
除非已经设置或取消了这个未来,否则
会使这个未来报告一个以给定的可抛出为其原因的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?
另外,我想知道为什么FutureTask不使用Thread.UncaughtExceptionHandler机制,有什么原因吗?
https://stackoverflow.com/questions/3555302
复制相似问题