点击关注公众号,实用技术文章及时了解

来源:blog.csdn.net/dabusiGin/article/details/105323796

在学习CallerRunsPolicy拒绝策略的时候,搜索了很多相关的知识,其他博主的描述是这样的:

第1种:

第2种:

第3种:

第4种:JDK文档(汉化版)

他们的描述让我看的很懵逼,特别是第3种,仔细看他的测试代码,并没有用CallerRunsPolicy,而是用的AbortPolicy拒绝策略。。。。这是一篇高浏览量的博文,而且多人转载。

其中上面几种情况中写到的“execute方法的调用线程”、“调用者线程”、“execute函数的上层线程”、“execute本身的线程”就是指的主线程,举个例子如下图所示,主线程就是平时执行main方法中代码的线程。

再通过一个例子详细说明:

class MyTask implements Runnable {private String id;public MyTask(String id) {this.id = id;}public void run() {System.out.println(id);}
}public class RejectPolicy {public static void main(String[] args) {ExecutorService es = new ThreadPoolExecutor(2, 2, 0L, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(3), Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());MyTask t1 = new MyTask("id:1");MyTask t2 = new MyTask("id:2");MyTask t3 = new MyTask("id:3");MyTask t4 = new MyTask("id:4");MyTask t5 = new MyTask("id:5");MyTask t6 = new MyTask("id:6");MyTask t7 = new MyTask("id:7");es.execute(t1);es.execute(t2);es.execute(t3);es.execute(t4);es.execute(t5);es.execute(t6);es.execute(t7);}
}

这里使用主要参数是:核心线程数为2、最大线程数为2、有界队列(容量为3)、默认线程工厂、CallerRunsPolicy拒绝策略。

运行结果如下:

id:1
id:2
id:3
id:4
id:6
id:5
id:7

可以看到所有的任务都执行了,没有真正意义上被拒绝的。

学习资料:Java进阶视频资源

代码中定义了核心线程数为2的线程池,一共有7个任务要执行,其中2个任务创建线程执行去了,3个任务放入了任务队列(workQueue)。

当提交到第6个任务的时候,会触发拒绝策略,在这里我们配置了CallerRunsPolicy策略,主线程直接执行第六个任务去了,不再向下执行main方法中的es.execute(t7)这段代码。

也就是说,在本程序中最多会有3个任务在执行,3个在等待。由此限制了线程池的等待任务数与执行线程数。所以JDK文档才会说:“这提供了一个简单的反馈控制机制,将降低新任务提交的速度”。

我的一点个人理解,希望能有助理解。

推荐:

主流Java进阶技术(学习资料分享)

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

大多数人不知道的:线程池CallerRunsPolicy()拒绝策略相关推荐

  1. Java线程池的拒绝策略

    一.简介 jdk1.5 版本新增了JUC并发编程包,极大的简化了传统的多线程开发.前面文章中介绍了线程池的使用,链接地址:https://www.cnblogs.com/eric-fang/p/900 ...

  2. Java多线程学习总结(4)——ThreadPoolExecutor 线程池的拒绝策略学习总结

    前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...

  3. 多线程之线程池的拒绝策略,以及生产环境如何合理设置参数(十二)

    上篇博文,我们详细的介绍了线程池的原理,这篇我们重点介绍线程池的拒绝策略,以及生产环境如何合理设置参数.为什么我们要单独拿出一篇博文来写拒绝策略以及配置参数呢?因为自定义线程池配置的重点就两项:一.选 ...

  4. 线程池的拒绝策略(重要)

    2019独角兽企业重金招聘Python工程师标准>>> 排队策略 1.直接提交 SynchronousQueue 它将任务直接提交给线程而不保存它们.在此,如果不存在可用于立即运行任 ...

  5. 一文详解java线程池 详解Java线程池的七个参数 详解池化技术 java如何选择核心线程数 详解Java线程池的拒绝策略

    目录 引言 线程池使用场景 加快请求响应(响应时间优先) 加快处理大任务(吞吐量优先) 特殊说明 线程池的池化技术 线程池的创建 手动创建 创建newFixedThreadPool线程池 创建newS ...

  6. 线程池自定义拒绝策略

    通过实现RejectedExecutionHandler接口,自定义一个拒绝策略类,重写它的rejectedExecution()方法: public class CustomRejectionHan ...

  7. Java线程池系列--饱和策略(拒绝策略)的使用(有实例)

    原文网址:Java线程池系列--饱和策略(拒绝策略)的使用(有实例)_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍Java线程池的饱和策略(拒绝策略). 概述 Java线程池的饱和策略如下: ...

  8. java线程池饱和策略_线程池的饱和策略-调用者执行 | 学步园

    java并发编程实践阅读笔记之线程池的饱和策略 使用java的任务管理框架的线程池执行任务时,线程池的任务等待队列被填满时,饱和策略开始发挥作用.ThreadPollExecutor的饱和策略通过se ...

  9. 【Android 异步操作】线程池 ( 线程池 reject 拒绝任务 | 线程池 addWorker 添加任务 )

    文章目录 一.线程池 reject 拒绝任务 二.线程池 addWorker 添加任务 在上一篇博客 [Android 异步操作]线程池 ( 线程池 execute 方法源码解析 ) 中 , 讲解 线 ...

最新文章

  1. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第7章-带有操作度及能量优化的分布式协同搬运控制
  2. 【杂谈】篇篇精华,有三AI不得不看的技术综述(超过100篇核心干货)
  3. BEGINNING SHAREPOINT#174; 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 SharePoint 2013 平台...
  4. c语言学籍管理实验报告,c语言实验报告(学生学籍管理系统)
  5. Self-introduction (自我介绍)
  6. 拓端tecdat|R语言rjags使用随机效应进行臭氧数据分析
  7. xshell 4 中文乱码问题解决
  8. Redis秒杀实战:微信抢红包(附源码)
  9. IDC运维工程师的基本要求
  10. c语言小游戏 贪吃蛇
  11. 如何用excel筛选相似内容_如何excel中筛选两个表中相同的数据
  12. AUTOSAR接口类型及访问规则
  13. win下安装mmcv的一些报错
  14. python爬虫实例手机_10个python爬虫入门实例
  15. Arcgis中山脊线,山谷线的提取,以及流域的分割
  16. 刚注册的Linkedin账号
  17. 王牌战士怎么用电脑玩 王牌战士模拟器玩法教程
  18. excel合并两列内容_合并多个Excel文件内容到一个Excel中
  19. 生产排程系统_APS生产排程系统应用-缩短产品生产周期
  20. VUE 自定义子组件v-bind及v-on指令的大小写问题

热门文章

  1. 12699元的iPhone 11 Pro Max物料成本却不足3500元,苹果赚疯了?
  2. 任正非:华为欲出售5G技术制造竞争对手
  3. 华为Mate 30系列后摄相机模组曝光:圆形三摄各有不同
  4. 蔚来首座超充站落地苏州蔚来交付中心 已开启试运营
  5. 未来感十足:小米发布四曲面屏幕专利
  6. 再谈网络字节顺序,大小端问题
  7. 情人节福利,用JAVA做个QQ机器人,帮我提醒女神按时喝水和陪她聊天~(开源)
  8. 华三交换机配置多个镜像口_H3C交换机端口镜像配置的方法
  9. ubuntu虚拟机进程被杀死_Linux进程被杀掉(OOM killer),查看系统日志
  10. KubeEdge 实践过程的记录