今天在复习线程池时,发现使用
ThreadPoolExecutor.submit方法
不会抛出异常,我就很疑惑。然后去查看了源码:
submit方法将任务构建为一个FutureTask去执行,这个类执行完毕任务后,会有一个返回值。
所以我们看看他的run方法是如何写的:
也就是说, FutureTask并没有抛出异常,而是将异常信息保存起来了,需要用get方法取出转态。
说完这个,我们就来实现一下统一保存线程池异常:
static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(30000),
r -> {
Thread thread = new Thread(r);
thread.setUncaughtExceptionHandler((t, e) -> {
System.out.println(t.getName() + e.getMessage());
});
return thread;
});
重写线程工厂的异常处理方法。