Java高并发编程系列(二)线程池之拒绝策略

之前,我们介绍了线程池的核心类ThreadPoolExecutor类。当然了,我们可以快捷的创建线程池,也可以通过Executors类来直接调用方法来创建线程池。

1、线程池拒绝策略

我们首先看一下拒绝策略的顶层接口,如下所示。

这个接口中定义了唯一的一个方法:

我们查看一下这个接口有以下几种实现类。这几个实现类其实都是

ThreadPoolExecutor中的内部类。所以此IDE显示很人性化,直接提示我们这些类在ThreadPoolExecutor类。

下面我们来进行一一介绍这几中策略。

(1)DiscardOldestPolicy策略

这个类实现了RejectedExecutionHandler接口中的方法。从源码中,我们可以看出这个类通过线程池获取到这个线程池的队列,然后调用poll方法将队列头部的任务拉黑。因为队列中最先进去的任务在队列头部。所以这个实现策略是将最老的任务拒绝掉。

(2)AbortPolicy策略

从源码上可以看出,这种拒绝策略的处理方法就是抛出一个异常。在Executors类中默认采用的都是这种策略。

(3)CallerRunsPolicy策略

如下,我们直接贴出源码再来分析细节。

我们看这个处理方法中,我们看到这个策略显然不想放弃执行任务。那么就用当前的Executor进行执行。不过,这样也有弊端,那就是阻塞当前Executor线程,造成该线程池无法调度任务。

(4)DiscardPolicy策略

这个策略有点意思了,啥都没做。意思就是来了任务,我没法处理就不管了。也不会将任务加入workQueue中的。

2、总结

看完本篇文章,你查看一下并发包下的线程池相关的类差不多都知道了。

里面涉及到一些创建workQueue参数使用的类,比如LinkedBolckingQueue等,留着后续专门分析这些类。

好了,今天先介绍到这儿,相信你到这里也可以回答之前那篇文章预留的3给问题了。

喜欢本文的朋友,可以关注我的公众号。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180828G1XZQI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券