之前,我们介绍了线程池的核心类ThreadPoolExecutor类。当然了,我们可以快捷的创建线程池,也可以通过Executors类来直接调用方法来创建线程池。
1、线程池拒绝策略
我们首先看一下拒绝策略的顶层接口,如下所示。
这个接口中定义了唯一的一个方法:
我们查看一下这个接口有以下几种实现类。这几个实现类其实都是
ThreadPoolExecutor中的内部类。所以此IDE显示很人性化,直接提示我们这些类在ThreadPoolExecutor类。
下面我们来进行一一介绍这几中策略。
(1)DiscardOldestPolicy策略
这个类实现了RejectedExecutionHandler接口中的方法。从源码中,我们可以看出这个类通过线程池获取到这个线程池的队列,然后调用poll方法将队列头部的任务拉黑。因为队列中最先进去的任务在队列头部。所以这个实现策略是将最老的任务拒绝掉。
(2)AbortPolicy策略
从源码上可以看出,这种拒绝策略的处理方法就是抛出一个异常。在Executors类中默认采用的都是这种策略。
(3)CallerRunsPolicy策略
如下,我们直接贴出源码再来分析细节。
我们看这个处理方法中,我们看到这个策略显然不想放弃执行任务。那么就用当前的Executor进行执行。不过,这样也有弊端,那就是阻塞当前Executor线程,造成该线程池无法调度任务。
(4)DiscardPolicy策略
这个策略有点意思了,啥都没做。意思就是来了任务,我没法处理就不管了。也不会将任务加入workQueue中的。
2、总结
看完本篇文章,你查看一下并发包下的线程池相关的类差不多都知道了。
里面涉及到一些创建workQueue参数使用的类,比如LinkedBolckingQueue等,留着后续专门分析这些类。
好了,今天先介绍到这儿,相信你到这里也可以回答之前那篇文章预留的3给问题了。
喜欢本文的朋友,可以关注我的公众号。
领取专属 10元无门槛券
私享最新 技术干货