java并发编程(10)-- 线程池 底层原理

本文通过银行运作的比喻,详细解释了Java线程池的corePoolSize、workQueue、maximumPoolSize和拒绝策略的工作流程。当任务提交时,线程池会根据当前运行线程数和队列状态决定是否创建新线程或使用已有资源。当线程空闲超时,线程池会收缩到corePoolSize大小。理解这些参数对于优化并发性能至关重要。
摘要由CSDN通过智能技术生成

理解:

线程池的创建参数,就像⼀个银⾏。

  • corePoolSize 就像银⾏的“当值窗⼝“,⽐如今天有2位柜员在受理客户请求(任务)。 如果超过2个客户,那么新的客户就会在等候区(等待队列 workQueue )等待。
  • 当等候区也满了,这个时候就要开启“加班窗⼝”,让其它3位柜员来加班,此时达到最⼤窗⼝ maximumPoolSize ,为5个。
  • 如果开启了所有窗⼝,等候区依然满员,此时就应该启动”拒绝策略“ handler ,告诉不断涌⼊的客户,叫他们不要进⼊,已经爆满了。
  • 由于不再涌⼊新客户,办完事的客户增多,窗⼝开始空闲,这个时候就通过 3个”加班窗⼝“取消,恢复到2个”当值窗⼝“。

 

案例图:

 

原理图:

上⾯银⾏的例⼦,实际上就是线程池的⼯作原理。

 

流程图:

 

流程:

1. 在创建了线程池后,开始等待请求。

2. 当调⽤execute()⽅法添加⼀个请求任务时,线程池会做出如下判断:

  • 2.1 如果正在运⾏的线程数量⼩于 corePoolSize ,那么⻢上创建核⼼线程运⾏执⾏这个任务;
  • 2.2 如果正在运⾏的线程数量⼤于或等于 corePoolSize ,那么将这个任务放⼊队列;
  • 2.3 如果这个时候等待队列已满,且正在运⾏的线程数量⼩于 maximumPoolSize ,那么还是要创 建⾮核⼼线程⽴刻运⾏这个任务;
  • 2.4 如果这个时候等待队列已满,且正在运⾏的线程数量⼤于或等于 maximumPoolSize ,那么线 程池会启动饱和拒绝策略来执⾏。

3. 当⼀个线程完成任务时,它会从等待队列中取出下⼀个任务来执⾏。

4. 当⼀个线程⽆事可做超过⼀定的时间( keepAliveTime )后,线程会判断:

  • 如果当前运⾏的线程数⼤于corePoolSize ,那么这个⾮核⼼线程就被停掉。
  • 当线程池的所有任 务完成后,它最终会收缩到corePoolSize的⼤⼩。

 

《Java 开发⼿册》是阿⾥巴巴集团技术团队:

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件工程小施同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值