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

理解:

线程池的创建参数,就像银

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

 

案例图:

 

原理图:

上例实际上就是线程池的原理。

 

流程图:

 

流程:

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

2. 当调xecute()添加请求任务时,线程池会做出如下判断:

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

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

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

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

 

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

 

 

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月6日
下一篇 2021年1月6日

相关推荐