首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在FutureTask中捕获异常

如何在FutureTask中捕获异常
EN

Stack Overflow用户
提问于 2010-08-24 17:56:07
回答 5查看 26.2K关注 0票数 23

在发现在Java1.6(和Eclipse中)的Executors.newCachedThreadPool()中运行的FutureTask允许Runnable.run()方法中的异常后,我尝试想出一种方法来捕获这些异常,而无需向我所有的Runnable实现添加抛出/捕捉。

应用程序接口建议覆盖FutureTask.setException()应该在这方面有所帮助:

除非已经设置或取消了这个未来,否则

会使这个未来报告一个以给定的可抛出为其原因的ExecutionException。此方法在计算失败时由run方法在内部调用。

但是,这个方法似乎没有被调用(使用调试器运行时,FutureTask捕获了异常,但没有调用setException )。我写了下面的程序来重现我的问题:

代码语言:javascript
运行
复制
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机制,有什么原因吗?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3555302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档