前言
分析前几天遇到的一个老代码留下的坑。线程池中运行Callable
线程时抛出的异常捕获不到,简化的逻辑如图,环境是jdk8:
运行结果:
解决方案
- 线程池返回
Future<>
,调用其get()
- 在Callable中 try-catch可能抛错的异常
运行结果:
源码分析
不难发现线程池提交时创建的类为FutureTask
。
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;