1. ThreadFactory+executor+UncaughtExceptionHandle处理异常
对线程池的创建中可以使用自定义的ThreadFactory,使用自定义的ThreadFactory时如果出现异常完全可以自定义处理。
MyThreadFactory 自定义的线程工厂,包含自定义的异常处理
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.ThreadFactory;
public class MyThreadFactory implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("定制线程池大小的自定义线程工厂 ");
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("自定义线程处理异常开始 "+ thread.getName());
e.printStackTrace();
}
});
return thread;
}
}
测试代码
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class MyThreadPoolExecutor {
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 5, TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(),new MyThreadFactory());
executor.execute(()->{
System.out.println(Thread.currentThread().getName()+" begin "+System.currentTimeMillis());
String s=null;
s.indexOf("a");
System.out.println(Thread.currentThread().getName()+" end "+System.currentTimeMillis());
});
}
}
测试结果:
定制线程池大小的自定义线程工厂 begin 1596344223105
自定义线程处理异常开始 定制线程池大小的自定义线程工厂
java.lang.NullPointerException
at thread.api.executor.MyThreadPoolExecutor.lambda 0 ( M y T h r e a d P o