通过Thread Pool Executor类解析线程池执行任务的核心流程( 四 )

addWorkerFailed(Worker)方法的逻辑就比较简单了,获取独占锁,将任务从workers中移除,并且通过CAS将任务的数量减1,最后释放锁 。
拒绝策略我们在分析execute(Runnable)方法时,线程池会在适当的时候调用reject(Runnable)方法来执行相应的拒绝策略,我们看下reject(Runnable)方法的实现,如下所示 。
final void reject(Runnable command) {handler.rejectedExecution(command, this);}通过代码,我们发现调用的是handler的rejectedExecution方法,handler又是个什么鬼,我们继续跟进代码,如下所示 。
private volatile RejectedExecutionHandler handler;再看看RejectedExecutionHandler是个啥类型,如下所示 。
package java.util.concurrent;public interface RejectedExecutionHandler { void rejectedExecution(Runnable r, ThreadPoolExecutor executor);}可以发现RejectedExecutionHandler是个接口,定义了一个rejectedExecution(Runnable, ThreadPoolExecutor)方法 。既然RejectedExecutionHandler是个接口,那我们就看看有哪些类实现了RejectedExecutionHandler接口 。

通过Thread Pool Executor类解析线程池执行任务的核心流程

文章插图
【通过Thread Pool Executor类解析线程池执行任务的核心流程】看到这里,我们发现RejectedExecutionHandler接口的实现类正是线程池默认提供的四种拒绝策略的实现类 。
至于reject(Runnable)方法中具体会执行哪个类的拒绝策略,是根据创建线程池时传递的参数决定的 。如果没有传递拒绝策略,则默认会执行AbortPolicy类的拒绝策略 。否则会执行传递的类的拒绝策略 。
在创建线程池时,除了能够传递JDK默认提供的拒绝策略外,还可以传递自定义的拒绝策略 。如果想使用自定义的拒绝策略,则只需要实现RejectedExecutionHandler接口,并重写rejectedExecution(Runnable, ThreadPoolExecutor)方法即可 。例如,下面的代码 。
public class CustomPolicy implements RejectedExecutionHandler {public CustomPolicy() { }public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {if (!e.isShutdown()) {System.out.println("使用调用者所在的线程来执行任务")r.run();}}}使用如下方式创建线程池 。
new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new CustomPolicy());至此,线程池执行任务的整体核心逻辑分析结束 。
点击关注,第一时间了解华为云新鲜技术~

经验总结扩展阅读