ThreadPoolExecutor runWorker 异常捕获
时间: 2023-06-28 12:11:52 浏览: 60
在ThreadPoolExecutor的实现中,每个线程都是一个Worker对象,它会不断从任务队列中取出任务并执行。当一个任务执行过程中抛出了异常,有两种可能的情况:
1. 如果该任务是通过submit()方法提交的,那么异常会被封装在一个ExecutionException中,并通过Future.get()方法抛出给调用者。
2. 如果该任务是通过execute()方法提交的,那么异常会被Thread.UncaughtExceptionHandler捕获并处理。
ThreadPoolExecutor中提供了一个默认的UncaughtExceptionHandler:ThreadFactoryBuilder.UncaughtExceptionHandler,它会将异常输出到System.err。如果需要自定义异常处理逻辑,可以通过以下两种方式进行:
1. 在创建ThreadPoolExecutor时,通过ThreadFactoryBuilder设置UncaughtExceptionHandler:
```
ThreadFactory factory = new ThreadFactoryBuilder()
.setNameFormat("worker-thread-%d")
.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler())
.build();
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), factory);
```
2. 继承ThreadPoolExecutor并重写afterExecute()方法,在该方法中处理异常:
```
public class MyThreadPoolExecutor extends ThreadPoolExecutor {
public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t != null) {
// 处理异常
System.err.println(t.getMessage());
}
}
}
```