1 四种解决任务代码抛异常的方案:
- 在我们提供的Runnable的run方法中捕获任务代码可能抛出的所有异常,包括未检测异常
- 使用ExecutorService.submit执行任务,利用返回的Future对象的get方法接收抛出的异常,然后进行处理(使用java.util.concurrent.FutureTask包装,实现call)
- 重写ThreadPoolExecutor.afterExecute方法,处理传递到afterExecute方法中的异常
- 为工作者线程设置UncaughtExceptionHandler,在uncaughtException方法中处理异常
要注意的是,使用最后一种方案时,无法处理以submit的方式提交的任务
1.1 第一种源码:异常会导致线程死亡,创建新的工作者加入线程池
1.2 第二种源码: 工作线程还是一样的,只是run方法是执行含有生命周期的Future对象,所以不会多次创建工作者
经过FutureTask包装! public FutureTask(Runnable runnable, V result) { this.callable = Executors.callable(runnable, result); this.state = NEW; // ensure visibility of callable }