关键点
问题的关键在于用线程池的行为代替线程池中任务的行为
使用 thread.setUncaughtExceptionHandler
完成上述转化
示例代码
static ExecutorService threadPool = new ThreadPoolExecutor(
coresize,maxsize,time,timeunit,
new ArrayBlockingQueue<>(3),
r->{
Thread thread = new Thread(r);
thread.setUncaughtExeceptionHandler((t,e)->{
log.error("异常信息");
});
}
);
需要注意
- 不能再处理与业务紧密耦合的异常,只能在使用的过程中使用线程和异常的信息
- 不能针对不同业务分别处理,除非在线程和异常中增加特殊信息用于区分
- 如果有这个机制,务必进行完整的宣贯,防止新人破坏或依然从任务中使用原始的异常处理方式
- 可能具有传染性
这种写法要求任务本身不处理非业务相关的普遍异常
因此若项目中具有多个线程池,可能导致因为线程池 A 用来这个机制,于是 A 中的任务不带有异常处理部分,因此线程池 B 中也不宜带有