- 不论是用execute 还是submit,都可以自己在业务代码上加try-catch 进行异常处理。我一般喜欢使用这种方式,因为我喜欢对不同业务场景的异常进行差异化处理,至少打不一样的日志吧。
- 如果是execute,还可以自定义线程池,继承ThreadPoolExecutor 并复写其afterExecute(Runnabler, Throwablet)方法。
- 或者实现Thread.UncaughtExceptionHandler 接口,实现void uncaughtException(Thread t, Throwable e);方法,并将该handler 传递给线程池的ThreadFactory。
- 但是注意,afterExecute 和UncaughtExceptionHandler 都不适用submit。因为通过上面的FutureTask.run()不难发现,它自己对Throwable 进行了try-catch,封装到了outcome 属性,所以底层方法execute 的Worker 是拿不到异常信息的。
资料来源:《Java开发者面试百宝书》,链接:https://developer.aliyun.com/topic/download?id=7899