ThreadPoolExecutor如何实现提交方法吞下异常,但执行-not

时间:2017-02-27 14:04:28

标签: java concurrency exception-handling threadpool threadpoolexecutor

众所周知,ThreadPoolExecutor有两种推送任务的方法:

提交并执行。

据我了解 - 主要区别如下:

提交返回Future,如果我们能够观察到在调用后的任务中发生的异常

future.get();

但是如果在作为提交推送的任务中发生异常 - 我们将在控制台中看到此异常(当然,如果此异常不会明确捕获)

我尝试调查ThreadPoolExecutor代码,并了解这是如何实现的。

我发现,submit方法使用execute方法:

public Future<?> submit(Runnable task) {
    if (task == null) throw new NullPointerException();
    RunnableFuture<Void> ftask = newTaskFor(task, null);
    execute(ftask);
    return ftask;
}

但是我无法在代码中找到可以检测到我们应该吞下异常的地方 - 或者不是。

请帮助在代码中找到这个逻辑。

1 个答案:

答案 0 :(得分:1)

您的task是一个FutureTask

如果您查看run方法的源代码(grepcode):

try {
    result = c.call();
    ran = true;
} catch (Throwable ex) {
    result = null;
    ran = false;
    setException(ex);
}

您会看到所有Throwable都被吞并了。