引子

线程池在项目中很常用,需要多个任务异步执行的地方我们都会去创建一个线程池。

我们看到 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)参数的浅析的更多相关文章

  1. 线程池ThreadPoolExecutor参数设置

    线程池ThreadPoolExecutor参数设置 JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同 ...

  2. 线程池ThreadPoolExecutor参数分析

    概述 比如去火车站买票, 有7个(maximumPoolSize)售票窗口, 但只有3个(corePoolSize)窗口对外开放.那么对外开放的3个窗口称为核心线程数, 而最大线程数是7个窗口. 如果 ...

  3. java线程池ThreadPoolExecutor使用简介

    一.简介线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize, int m ...

  4. 线程池ThreadPoolExecutor

    线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maxi ...

  5. 关于线程池ThreadPoolExecutor使用总结

    本文引用自: http://blog.chinaunix.net/uid-20577907-id-3519578.html 一.简介 线程池类为 java.util.concurrent.Thread ...

  6. [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用

    PS: Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool 引用 [轰隆隆] 的 Java自带的线程池Thre ...

  7. android线程池ThreadPoolExecutor的理解

    android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...

  8. 线程池ThreadPoolExecutor使用简介

    一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...

  9. 线程池ThreadPoolExecutor使用简介(转)

    一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...

  10. java线程API学习 线程池ThreadPoolExecutor(转)

    线程池ThreadPoolExecutor继承自ExecutorService.是jdk1.5加入的新特性,将提交执行的任务在内部线程池中的可用线程中执行. 构造函数 ThreadPoolExecut ...

随机推荐

  1. FlashCache初体验

    注意: 测试用的是CentOS6.5 内核版本2.6.32-431.el6.x86_64 步骤: 上传CentOS6.5做本地yum源,安装以下包. yum install gcc yum insta ...

  2. LeetCode 045 Jump Game II

    题目要求:Jump Game II Given an array of non-negative integers, you are initially positioned at the first ...

  3. Spring Boot 内置定时任务

    启用定时任务 @SpringBootApplication @EnableScheduling // 启动类添加 @EnableScheduling 注解 public class ScheduleD ...

  4. 第8.13节 Python类中内置方法__repr__详解

    当我们在交互环境下输入对象时会直接显示对象的信息,交互环境下输入print(对象)或代码中print(对象)也会输出对象的信息,这些输出信息与两个内置方法:__str__方法和__repr__方法有关 ...

  5. Python正则运算符优先级re.findall('(.)*',"abc")、re.findall('(.*)',"abc")、re.findall('(.?)*',"abc")的执行结果的影响分析

    我们分别执行三个语句: >>> re.findall('(.)*',"abc") ['c', ''] >>> re.findall('(.*)' ...

  6. 第13.1节 关于Python的异常处理

    Python的异常网上有很多资料介绍,老猿就不再细说,在这里老猿只挑几件老猿认为重要的内容介绍一下. 一. 异常处理完整语法 异常处理的完整语法语法如下: try: - except (异常1,-,异 ...

  7. 第14.1节 通过Python爬取网页的学习步骤

    如果要从一个互联网前端开发的小白,学习爬虫开发,结合自己的经验老猿认为爬虫学习之路应该是这样的: 一. 了解HTML语言及css知识 这方面的知识请大家通过w3school 去学习,老猿对于html总 ...

  8. PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项

    根据<PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法>可以重写从PyQt的Model类继承的setData方法来实时截获View中对数据的更改,但需要注意 ...

  9. CobaltStrike 生成office宏病毒进行钓鱼攻击

    关于WORD宏: 在百度百科上有: 宏是一个批量处理程序命令,正确地运用它可以提高工作效率.微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力.如完打开word文 ...

  10. FM解析(因子分解机,2010)

    推荐参考:(知乎) https://zhuanlan.zhihu.com/p/37963267 要点理解: 1.fm应用场景,为什么提出了fm(和lr的不同点) ctr预测,特征组合,fm的隐向量分解 ...