计算机系统应用教程网站

网站首页 > 技术文章 正文

Java线程池中的最大线程为啥要队列满的时候再创建呢

btikc 2024-10-22 10:32:27 技术文章 11 ℃ 0 评论

我们首先看下线程池的构造方法,如图1示:



  • corePoolSize:核心数,不管什么时候线程数都不小于corePoolSize
  • maximumPoolSize:最大线程数
  • keepAlivetime:空闲线程存活时间
  • unit:空闲线程存活时间单位
  • workQueu:阻塞队列
  • threadFactory:线程工厂,主要是用于创建线程,可以指定线程名称,组等
  • handler:拒绝策略

线程池的底层执行原理如图2所示:

  1. 线程池启动,创建corePoolSize的线程数组
  2. 若当前任务数大于corePoolSize时,将runnable任务push到队列中
  3. 若当前队列满了,仍然有任务进来则判断当前线程数是否大于maximumPoolSize,不大于则创建线程
  4. 若当前线程数等于maximumPoolSize,仍然有任务进来则执行拒绝策略。

我们重点看第三步,为啥是等线程队列满了再创建,而不是一开始任务大于corePoolSize时就创建呢。我举个例子就明白了,比如一个工厂有10个工人,一般情况下10个工人工作量刚刚饱和,这时工厂突然接了大批订单,而工厂只有10个人,老板为了节约成本,让那10个人加班,做不完的线挤压。但是虽然时间越来越长,工人的抱怨情绪越来越多,最后老板顶不住了就在外边找几个临时工来缓解工人们的压力。通过这个例子,我们可以得出老板的目的是为了节约成本,那么反观线程池呢,我们都知道大部分情况下线程池中的任务都不是很多的,若当任务量大于corePoolSize时就创建线程,会造成什么现象呢?CPU会忙于创建线程、销毁线程,浪费了cpu、内存,所以呢,线程池为了减轻cpu、内存的压力,当队列满的时候再创建线程。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表