善治病者,必医其受病之处;
善救弊者,必塞其弊之源

书接上文线程池的设计思路,带着如何设计拒绝策略的你,又回顾了整个流程,突然你想这事因排队而起,能不能在排队的队列上有所改进。

第一部分 排队也是值得考虑的

BlockingQueue:任务队列
我们来看一下Doug Lea事先给我们设计好的队列:

1. LinkedBlockingQueue

基于链表实现的(无界的)阻塞队列,默认情况下容量是 Integer.MAX_VALUE,可以说是无界的。
只有调用这个构造函数才可以设置容量capacity,否则都是Integer.MAX_VALUE。

 public LinkedBlockingQueue(int capacity) {if (capacity <= 0) throw new IllegalArgumentException();this.capacity = capacity;last = head = new Node<E>(null);}
2. ArrayBlockingQueue

基于数组实现的有界阻塞队列。默认情况下,不保证FIFO的顺序(By default, this ordering is not guaranteed).。因为公平策略将会降低吞吐率,但是也降低了可变性以及避免了饥饿现象.(Fairness generally decreases throughput but reduces variability and avoids starvation.)

// 注意: 参数fair默认为false,  true -保证FIFO public ArrayBlockingQueue(int capacity, boolean fair) {if (capacity <= 0)throw new IllegalArgumentException();this.items = new Object[capacity];lock = new ReentrantLock(fair);notEmpty = lock.newCondition();notFull =  lock.newCondition();}
3. SynchronousQueue

A blocking queue in which each insert operation must wait for a corresponding remove operation by another thread, and vice versa(反之亦然).
同步队列-不存储任务的阻塞队列。插入操作 和 删除操作是一一对应的。就像一个空集合(acts as an empty collection)

三者之间的联系

  1. 吞吐率角度:

SynchronousQueue > LinkedBlockingQueue > ArrayBlockingQueue

  1. FIFO的角度:

LinkedBlockingQueue 直接按照队列的FIFO设计;
SynchronousQueue, ArrayBlockingQueue 默认都是不保证FIFO顺序的,可以在构造函数中打开fairness。

  1. 容量角度:

LinkedBlockingQueue默认容量是无限制的,直接打翻了“临时工”的饭碗。即:maxiumPoolSize失去了意义。PS:2333, "正式工"已经哭晕倒厕所里啦,往死里干。

世界本来就是不公平的,面对现实吧!!!

4. PriorityBlockingQueue

具有优先级的阻塞队列,初始容量是11。Obviously, 它不保证FIFO,如果需要可以自定义类去打破其优先级(有病啊?OR闲得啦?).

还有几种阻塞队列,但是我认为记住这四种差不多就够用啦,后面的遇到再介绍。怕:消化不良 2333

BlockingQueue归纳一下:

尽情地发挥想象:

  1. LinkedBlockingQueue:为了防止插队,用绳索把每个人都串联起来(PS:这绳索默认还是无限长地(Integer.MAX_VALUE)),MMP,还得请城管大队长喝酒啊;
  2. ArrayBlockingQueue:绑起来貌似有点不厚道,还是把绳索解开,但是都别乱动啊。为了不惊动城管,不准站太多人。
  3. PriorityBlockingQueue:城管大人站在队列地尾部,对你投来迷之微笑,吓得你毛骨悚然,怕遇到“同志”。正在发愣地时候,城管大人一只手搭在你的肩膀上,老弟不请我吃一顿。此时你那还管什么FIFO啊,直接拉着城管大人地手往店里走。
  4. SynchronousQueue:城管大人说饱喝足,走出门口说:上面检查,排队影响市容市貌,不准排队。你看着办吧。只能(来一个走一个,走一个来一个)。PS:一首凉凉送给你

第二部分:学会拒绝

RejectedExecutionHandler 拒绝策略

1. AbortPolicy

简单粗暴,你值得选择。

默认策略:直接拒绝并抛出运行时异常:RejectedExecutionException

2. DiscardPolicy

冲动是魔鬼,默默地拒绝。

直接拒绝但不抛异常。

3. DiscardOldestPolicy

为了大局而牺牲局部利益

直接拒绝队列的头部,为了不犯众怒,你只好对队列的第一个人说不。毕竟:得罪一个,取悦一群啊。

4. CallerRunsPolicy

从哪来回哪去

交给调用者所在的线程来处理任务。

5. 自定义策略

随心所欲

实现RejectedExecutionHandler接口。比如送个优惠券啥的…

RejectedExecutionExecutor总结

这里假设:正是饥饿的时候,不让吃饭谁能心里舒服,谁也不愿意啊,

  1. AboryPolicy :直接拒绝结果把人給打了一顿,这样饭店也干不下去啦…
  2. DiscardPolicy:陪着笑脸,打不还手骂不还口直的拒绝
  3. DiscardOldestPolicy: 为了大部分人的利益而牺牲少数人。排队的人在后面起哄,质问前面的人怎么还没走啊。为了平复后面的人,只能牺牲一下队列首位啦。PS:电车悖论
  4. CallerRunsPolicy : 冷处理
  5. 自定义策略:为了不得罪顾客,可能你要发个优惠券啥的。

通过这两篇文章,我认为大家对ThreadPoolExecutor应该有了一个清晰的认识。更为详细的内容,后续慢慢补充。接下来要实现你做大老板的梦想——开连锁店。

线程池2nd卷:虎落平阳被犬欺相关推荐

  1. 线程池6th卷:大展经纶补天手

    聊一聊Doug Lea的生意经 1.第一阶段:Executor 早期创业时候不想那么多,能做生意就行.所以只有一个方法:execute() public interface Executor {voi ...

  2. 龙游浅水遭虾戏,虎落平阳被犬欺

    三国演义里描写,周瑜嫉妒孔明的才能,总想加害孔明.有一天想出了一条妙计,设宴相请,并以对诗为名进行加害.孔明早已觉察周瑜的心意,便故意说:"谁输了就砍谁的头."周瑜暗自大喜,忙说: ...

  3. OSChina 周四乱弹 ——虎落平阳被犬欺,猫落浴缸毛变稀

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2018)请戳(这里) [今日歌曲] @沉默的小W  :@小小编辑 点歌 Timo Tolkki-Are yo ...

  4. 线程池3rd卷:龙卧浅滩等海潮

    笑谈ThreadFactory 全世界让一个人沉默并不比一个人让全世界沉默更具有正当性.--约翰•密尔 眼看你的饭店生意越做越大,又出现了一个头疼的问题--厨师管理问题.福祸相依,你发现有些厨师培训学 ...

  5. 0816(032天 线程/进程03 一点细节+线程池)

    0816(032天 线程/进程03 一点细节+线程池) 每日一狗(田园犬西瓜瓜) 线程/进程03 一点细节+线程池 文章目录 0816(032天 线程/进程03 一点细节+线程池) 线程/进程03 一 ...

  6. linux线程池实现多线程并发,基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF...

    基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF 第 卷 第 期 电子设计工程 年 月 基于 的多线程池并发 服务器设计 陈 涛 任海兰 武汉邮电科学研究院 湖北 武汉 摘要 时至今 ...

  7. [转]javaandroid线程池

    java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一) java多线程同步以及线程间通信详解&消费者生产者模式&死锁 ...

  8. 池化技术及jdk的线程池讲解

    概述 程序运行的本质是消耗系统资源,线程.数据库连接等都会耗费系统的资源.线程.数据库连接等的创建.销毁等都十分消耗系统资源,所以,如果使用池化技术(线程池.数据库连接池等),可以对系统资源进行控制和 ...

  9. 线程池踩坑记 --load飙高的原因

    去年处理过一个美图的问题,最近又碰到类似问题了,发现跟美图那个案例原因是一样的,在这里拿出来给大家分享一下. 应该是去年6月底,我们私有化发布了新版本,然后就拿去给美图客户安装部署了,美图的美拍应用访 ...

最新文章

  1. 检查oracle安装,oracle安装前环境检查
  2. .NET 泛型,详细介绍
  3. 【软考高项】信息系统项目管理师 论文写作技巧分享 (上)
  4. poj1611(简答并查集)
  5. VS2017的内存分析
  6. PCWorld选出52个实用网站
  7. 单设施选址-重心法-Matlab
  8. 机器学习-基于Logistic回归和Sigmoid函数的分类
  9. EverEdit: Windows上国人开发的比Notepad++更优秀的高级文本编辑器
  10. 超算优化重在存储,DAOS助力瑞金打造先进的生信大数据平台
  11. C# 简单判断枚举值是否被定义
  12. Android开发中Html.fromHtml(String source)方法过时的替代方法
  13. 怎样学习C语言——快速上手C语言系列之—什么是指针
  14. php 关键词挖掘,如何挖掘长尾关键词
  15. Aspose最新版22.8教程
  16. IoT 恶意软件攻击剖析
  17. K8S部署单节点zookeeper服务
  18. Linux中ssh访问与ftp登录
  19. 为什么纸张仍然是您最好的设计工具
  20. Error: Flash Download failed - “Cortex-M3“的解决方法

热门文章

  1. AGE-PERIOD-COHORT (APC) 连续变量和二分类变量分析全代码
  2. echarts.js 官网
  3. 低版本360浏览器下,PDF.js部分文字显示不全的问题
  4. 安装mathpix注册不了账户:unexcepted error
  5. 马斯克的推特CEO继任者曝光:带着老婆孩子睡公司,钢铁侠20年嫡系,现在掌舵挖洞公司...
  6. 基于数据库实现微服务动态路由
  7. Java Jsp+mysql实现企业财务管理系统(普通职工/管理员 员工、公司资产、经营、费用管理)
  8. usb 启动盘制作的几种办法
  9. 1998年图灵奖--詹姆斯·格雷简介
  10. 动软代码生成器基础使用