2

线程池创建新线程为何必须等队列全部满了才创建

 2 years ago
source link: https://www.oschina.net/question/2652412_2324847
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

线程池创建新线程为何必须等队列全部满了才创建

sprouting 发布于 01/04 09:40
阅读 744

为何线程池创建新线程是这样设计的?比如核心线程数量2,最大4,队列5,只有核心线程全部在跑,队列数量已经超过5,且不超过最大线程数4,才创建新线程

为何不是队列数量到了一定程度就创建新线程的?

kakai
01/06 09:38

线程池也就是对象池,池里都没满干嘛要额外创建线程?换个角度,队列没满而是到一定程度就去创建线程,那又得什么时机去push和pop呢?高并发场景如何处理?把线程池化的优势又该如何体现呢?如果这些问题你都考虑清楚了,那么可以参考ThreadPoolExecutor自己实现一个。

freekevin
01/06 10:43

可以看看Tomcat的线程池实现方式

ArchitectureMaster
01/06 15:15

1.线程池一般设计者都是使用可并发的队列来承载每个线程对象的。因为队列在线程调用时最方便而且速度也最快。

2.线程池的长度通常是队列的长度,而这样做的目的通常是可以根据对线程的消耗而动态调整线程池的数量。在性能不佳的主机上可以通过对线程队列长度的控制来减少内存溢出的可能性,当然会以下降性能为代价,在性能很强的主机上增加线程数的供从而提升应用的CPU利用率。

3.线程池使用队列对于多线程调用更友好,队列在多线程并行访问时优势比其它数据集合更明显。

不同的容器用途是不同的:列表适合单线程而队列则适合多线程,都知道一个array同时读写肯定会出现问题,多半是使用同步非它与锁的方式解决,这样性能会降低。而队列由于其读写位置不同并不会出现这个问题,所以多线程同时对一个队列操作更安全高效。线程池多半实现就是队列或者stack也有,但方向相反,高低字节位等需要逆向操作时会用到stack,因为stack是后入先出的。

sunangie
01/07 13:12

线程的创建本身也有开销

贝克街的天才
01/07 21:44

因为没必要,队列有空余的空间 就往里面丢就好了。 如果按你的逻辑,那么队列不是永远不会满了? 而且任务到了一定数量后,你丢进去一个任务就会出现一个线程, 依然会出现 线程数过多的情况, 这跟线程池的设计初衷是违背的。

如果担心队列会满,可以用链表队列。不要担心 任务多了来不及消费,如果这种风险很高的话,那说明这个场景不适合用线程池。

土豆侠七号
01/08 08:56

基于现实生活去考虑就行。你去窗口办业务,开始窗口只有2个工作人员,办业务的人多了工作人员忙不过来只能让你排队,后续办业务的人越来越多,这时候是不是可以启动应急预案,再加几个窗口办公人员(最大线程数)处理业务请求。编程思想来源于生活

雷兽
前天 16:13

其实 我觉得 这不过是个历史选择问题。。。。而且不积极新建新线程 有利于节省内存。。。。。。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK