关于线程池(ThreadPoolExecutor)参数的浅析
引子
线程池在项目中很常用,需要多个任务异步执行的地方我们都会去创建一个线程池。
我们看到 ThreadPoolExecutor源码中提供了更方便的工厂方法(Executors)使用。

提供方便应该是更好的,而阿里针对线程池工厂方法的使用做了限制,是为什么呢?

限制的恰好是工厂方法中对应提供的几个方法,让我们带着疑问去看源码是为什么
分析
ThreadPoolExecutor 提供了很多参数,分别介绍一下:
- corePoolSize 线程池中最少的工作线程,不允许销毁,除非设置了 allowCoreThreadTimeOut 参数
- maximumPoolSize 线程池中最多工作线程数(最大可以是2^29-1个)
- workQueue 任务队列,用于保存任务和执行任务之间切换
- keepAliveTime: 如果 当前线程数量 > corePoolSize,多出来的线程会在keepAliveTime之后就被释放掉
- unit: keepAliveTime的时间单位,比如分钟,小时等
- handler: 就是说当线程,队列都满了,之后采取的策略,比如抛出异常等策略
接下来我们通过实际场景分析一下。
我们假定有这个场景:
corePoolSize:1
mamximumPoolSize:3
keepAliveTime:60s
workQueue:ArrayBlockingQueue,有界阻塞队列,队列大小是4
handler:默认的策略,抛出来一个ThreadPoolRejectException
以下是新任务来时的场景:以poolSize=0 表示线程数量
- 来了一个任务,poolSize<corePoolSize 新建一个线程
- 又来了一个任务,poolSize>=corePoolSize ,队列未满,将任务丢入队列等待执行
- 继续添加任务,如果队列满了,而 poolSize < maximum,此时将会新建线程
- 如果继续添加任务,队列满,线程数量达到maximum,则会让handler 去处理。默认抛出异常
- 如果现在线程数量是3,但是都处于空闲状态,空闲超过60s 之后,其中2个线程就会被回收,保留一个(coolPoolSize=1)
所以当任务来临时的处理顺序是这样的:
- 首先创建 corePoolSize 线程
- 然后丢到队列等待
- 队列满,新建maximum线程
- 继续满,handler 处理
被禁止的原因
- 先看看 FixedThreadPool

可以看到,队列是没有限制大小的,所以,不会出现让 handler 去处理的情况。
SingleThreadPool 同理 - 再看看CachedThreadPool

可以看到,最大线程数是 Integer.MAX_VALUE ,线程数量太多。
ScheduledThreadPool 同理
总结
使用线程池前,先弄清楚各个参数的意义,然后再去使用自定义参数,让后续看代码的人可以清楚的知道线程的瓶颈,根据需要去使用。
关于线程池(ThreadPoolExecutor)参数的浅析的更多相关文章
- 线程池ThreadPoolExecutor参数设置
线程池ThreadPoolExecutor参数设置 JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同 ...
- 线程池ThreadPoolExecutor参数分析
概述 比如去火车站买票, 有7个(maximumPoolSize)售票窗口, 但只有3个(corePoolSize)窗口对外开放.那么对外开放的3个窗口称为核心线程数, 而最大线程数是7个窗口. 如果 ...
- java线程池ThreadPoolExecutor使用简介
一.简介线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize, int m ...
- 线程池ThreadPoolExecutor
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maxi ...
- 关于线程池ThreadPoolExecutor使用总结
本文引用自: http://blog.chinaunix.net/uid-20577907-id-3519578.html 一.简介 线程池类为 java.util.concurrent.Thread ...
- [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
PS: Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool 引用 [轰隆隆] 的 Java自带的线程池Thre ...
- android线程池ThreadPoolExecutor的理解
android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...
- 线程池ThreadPoolExecutor使用简介
一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...
- 线程池ThreadPoolExecutor使用简介(转)
一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...
- java线程API学习 线程池ThreadPoolExecutor(转)
线程池ThreadPoolExecutor继承自ExecutorService.是jdk1.5加入的新特性,将提交执行的任务在内部线程池中的可用线程中执行. 构造函数 ThreadPoolExecut ...
随机推荐
- mysql 数据文件
mysql8.0取消了frm文件 . ibd数据和索引
- pixi.js持续渲染页面
Pixi是一个超快的2D渲染引擎,通过Javascript和Html技术创建动画或管理交互式图像,从而制作游戏或应用. 项目地址:https://github.com/pixijs/pixi.js A ...
- Windows 10系统运维之OpenSSH
随着PowerShell和OpenSSH的日渐成熟,在客户终端Windows居多的运维之中,使用Win32-OpenSSH和Powershell来管理一些客户机变成了相当实用的一种解决方案. Open ...
- 【GDOI2014模拟】JZOJ2020年8月14日T2 网格
[GDOI2014模拟]JZOJ2020年8月14日T2 网格 题目 Time and Memory Limits Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标 ...
- PyQt(Python+Qt)学习随笔:QTreeView树形视图的allColumnsShowFocus属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeView树形视图的allColumnsShowFocus属性用于控制是否使视图中的所有列显 ...
- JVM 垃圾回收?全面详细安排!
写在前面: 小伙伴儿们,大家好!今天来学习Java虚拟机相关内容,作为面试必问的知识点,来深入了解一波! 思维导图: image-20201207153125210 1,判断对象是否死亡 我们在进行垃 ...
- 小程序setData 修改数组附带索引解决办法
this.setData({'judge[current]':true}); 以此句进行修改值,会报错 Error: Only digits (0-9) can be put inside [] in ...
- webstorm2020最新安装破解教程方法永久激活码
现在webstorm的版本已经更新到2020.3了,还没有升级的小伙伴们赶紧升级啦,本文教大家如何安装webstorm2020.3版本并且破解,此方法亲测百分百可以永久激活webstorm2020.3 ...
- 算法——模拟LRU机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 . 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 ...
- STL——容器(Map & multimap)的查找
map.find(key); //查找键key是否存在,若存在,返回该键的元素的迭代器:若不存在,返回map.end(); map.count(key); //返回容器中键值为key的对组个数 ...