线程池的异常处理,我们常用execute() 和 submit() 方法进行任务提交,submit 需要通过返回值手动去获取异常,而execute 则会把异常直接输出到控制台,所以在编写代码时,应避免异常逃逸出run() 方法之外。如果没有注意,异常逃逸,我们还是能够进行捕获的。通过实现Thread.UncaughtExceptionHandler接口,在线程由于未捕获的异常而即将消亡时,便会自动调用uncaughtException方法进行兜底。
下面便是示例:
public class SsmApplication {
//方法一:全局配置线程异常处理器
static {
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
}
public static void main(String[] args) {
//ExecutorService executorService = Executors.newFixedThreadPool(2,new MyThreadFactory());
ExecutorService executorService = Executors.newFixedThreadPool(2);
try {
executorService.execute(()-> {
System.out.println(Thread.currentThread().getName());
int i = 2/0;
});
}catch (Exception e){
System.out.println("我想捕获异常,发现无法捕获到");
}
executorService.shutdown();
}
private static class MyThreadFactory implements ThreadFactory {
private static final AtomicInteger ATOMIC_INTEGER = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("http-kdxf-" + ATOMIC_INTEGER.getAndIncrement());
方法二:使用时配置线程异常处理器
thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
return thread;
}
}
//自定义线程异常处理器进行兜底
private static class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
@Override
public void uncaughtException(Thread t, Throwable e) {
//捕获到异常,并进行处理
System.out.println(t +":" + e);
}
}
}