众所周知,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;
}
但是我无法在代码中找到可以检测到我们应该吞下异常的地方 - 或者不是。
请帮助在代码中找到这个逻辑。
答案 0 :(得分:1)
您的task
是一个FutureTask
。
如果您查看run
方法的源代码(grepcode):
try {
result = c.call();
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
setException(ex);
}
您会看到所有Throwable
都被吞并了。