JDK线程池异常处理方式
1. 抛出异常
execute()
java.util.concurrent.ThreadPoolExecutor#runWorker 中抛出,抛出之后经过以下两个步骤:
catch块捕获,捕获之后再抛出给JVM,JVM调用java.lang.Thread#dispatchUncaughtException 处理;
dispatchUncaughtException最后将异常交给uncaughtExceptionHandler处理,这意味着可以自定义uncaughtExceptionHandler处理异常;
finally块里调用java.util.concurrent.ThreadPoolExecutor#afterExecute 处理。
此方法是一个protected方法,意味着子类可以覆盖afterExecute 方法,实现自己的异常处理逻辑。
submit()
java.util.concurrent.FutureTask#run 中抛出异常后会被捕获,不会抛给JVM,而是调用setException方法将异常设置给输出outcome;
最后调用java.util.concurrent.FutureTask#get() 获取线程运行结果时将异常抛出。
2. 异常处理方式
execute()
a.业务代码内部try-catch处理
b.自定义线程的uncaughtExceptionHandler
c.覆盖线程池的afterExecute()方法
submit()
业务代码内部try-catch处理