线程池的4种拒绝策略

2019/10/14 13:55
阅读数 16

<div id="content_views" class="markdown_views prism-dracula"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p>1.ThreadPoolExecutor类实现了ExecutorService接口和Executor接口,可以设置线程池corePoolSize,最大线程池大小,AliveTime,拒绝策略等。<strong>常用构造方法</strong>:<br> ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,<br> long keepAliveTime, TimeUnit unit,BlockingQueue workQueue,<br> RejectedExecutionHandler <wdautohl-customtag style="font-weight:bold;color:red;font-size:inherit;display:inline;" id="wdautohl_id_1" class="wdautohl_aGFuZGxlcg__">handler</wdautohl-customtag>)</p> <p><strong>corePoolSize: 线程池维护线程的最少数量<br> maximumPoolSize:线程池维护线程的最大数量<br> keepAliveTime: 线程池维护线程所允许的空闲时间</strong>(解释:当线程池的数量超过corePoolSize时,多余的空闲线程的存活时间。)<br> <strong>unit: 线程池维护线程所允许的空闲时间的单位<br> workQueue: 线程池所使用的缓冲队列<br> handler: 线程池对拒绝任务的处理策略</strong><br> <img src="https://img2018.cnblogs.com/blog/1112483/201910/1112483-20191014135910384-809936631.png" alt="在这里插入图片描述"><br> handler有四个选择:</p> <p><strong>策略1:ThreadPoolExecutor.AbortPolicy()</strong><br> 抛出java.util.<wdautohl-customtag style="font-weight:bold;color:red;font-size:inherit;display:inline;" id="wdautohl_id_2" class="wdautohl_Y29uY3VycmVudA__">concurrent</wdautohl-customtag>.RejectedExecutionException异常 ,示例如下:<br> <img src="https://img2018.cnblogs.com/blog/1112483/201910/1112483-20191014135926973-1502288856.png" alt="在这里插入图片描述"><br> <strong>小疑问</strong>:笔者对运行结果还是有一些疑问,为什么异常在下面第3行就出现了<br> <img src="https://img2018.cnblogs.com/blog/1112483/201910/1112483-20191014135943260-1334329521.png" alt="在这里插入图片描述"></p> <p><strong>策略2:ThreadPoolExecutor.CallerRunsPolicy</strong><br> 用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。如下:(<strong>小疑问</strong>:笔者对运行结果还是有很多的疑问,比如pool-1-thread-7 is running连续出现了好多次,这是为什么呢?)<br> <img src="https://img2018.cnblogs.com/blog/1112483/201910/1112483-20191014140002545-504841230.png" alt="在这里插入图片描述"><br> 解释:上面zxai<br> <strong>策略3</strong>:RejectedExecutionHandler <wdautohl-customtag style="font-weight:bold;color:red;font-size:inherit;display:inline;" id="wdautohl_id_3" class="wdautohl_aGFuZGxlcg__">handler</wdautohl-customtag> =<br> new ThreadPoolExecutor.DiscardOldestPolicy();<br> 这样运行结果就不会有100个线程全部被执行。处理源码如下:<br> Java中Queue的一些常用方法:<br> poll() 移除并返问队列头部的元素<br> <img src="https://img2018.cnblogs.com/blog/1112483/201910/1112483-20191014140021167-2014223808.png" alt="在这里插入图片描述"><br> <strong>解释</strong>:该策略将丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。(问:为什么是弹出队列的头元素呢?答:是因为队列的先进先出原则,所以队列的头元素肯定是最老的一个请求,而DiscardOldestPolicy策略就是把最老的请求废除,把这个机会(相当于抢了最老的请求的吃到嘴边的肉)留给当前新提交到线程池里面的线程(这个时候线程池已经满了,队列也已经满了,如果不满的话,也不会有拒绝策略了!))</p> <p><strong>策略4</strong>:ThreadPoolExecutor.DiscardPolicy<br> 用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。<br> 运行结果也不会全部执行100个线程。<br> 源码如下,实际就是对线程不执行操作:<br> <img src="https://img2018.cnblogs.com/blog/1112483/201910/1112483-20191014140036895-2032968041.png" alt="在这里插入图片描述"><br> <img src="https://img2018.cnblogs.com/blog/1112483/201910/1112483-20191014140049531-1896512291.png" alt="在这里插入图片描述"></p> 原文地址:https://blog.csdn.net/qq_40241957/article/details/85468994

                                </div>
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部