线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?

Posted 2324hh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?相关的知识,希望对你有一定的参考价值。

线程池中阻塞队列的作用:
1.⼀般的队列只能保证作为⼀个有限⻓度的缓冲区,如果超出了缓冲⻓度,就⽆法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续⼊队的任务。
2.阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进⼊wait状态,释放cpu资源。
3.阻塞队列⾃带阻塞和唤醒的功能,不需要额外处理,⽆任务执⾏时,线程池利⽤阻塞队列的take⽅法挂起,从⽽维持核⼼线程的存活、不⾄于⼀直占⽤cpu资源
为什么是先添加列队而不是先创建最大线程?
在创建新线程的时候,是要获取全局锁的,这个时候其它的就得阻塞,影响了整体效率。
 

就好⽐⼀个企业⾥⾯有10个(core)正式⼯的名额,最多招10个正式⼯,要是任务超过正式⼯⼈数(task > core)的情况下,⼯⼚领导(线程池)不是⾸先扩招⼯⼈,还是这10⼈,但是任务可以稍微积压⼀下,即先放到队列去(代价低)。10个正式⼯慢慢⼲,迟早会⼲完的,要是任务还在继续增加,超过正式⼯的加班忍耐极限了(队列满了),就的招外包帮忙了(注意是临时⼯)要是正式⼯加上外包还是不能完成任务,那新来的任务就会被领导拒绝了(线程池的拒绝策略)。 

 

 

以上是关于线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?的主要内容,如果未能解决你的问题,请参考以下文章

并发队列之ConcurrentLinkedQueue

阻塞队列BlockingQueue

Java 线程中协作机制

java多线程---阻塞队列

5000字12 连环炮一张图快速搞定线程池

线程池ThreadPoolExecutor分析: 线程池是什么时候创建线程的,队列中的任务是什么时候取出来的?