ThreadPoolExecutor运转机制详解(转)
?
總結(jié):看了下文后,發(fā)現(xiàn)用這個線程池,還是得用上那個異常處理,再自己重寫,異常時的處理。這樣才不會丟任務(wù).
?
原文:http://blog.csdn.net/cutesource/article/details/6061229
最近發(fā)現(xiàn)幾起對ThreadPoolExecutor的誤用,其中包括自己,發(fā)現(xiàn)都是因為沒有仔細看注釋和內(nèi)部運轉(zhuǎn)機制,想當然的揣測參數(shù)導(dǎo)致,先看一下新建一個ThreadPoolExecutor的構(gòu)建參數(shù):
?
[java]?view plaincopy?
看這個參數(shù)很容易讓人以為是線程池里保持corePoolSize個線程,如果不夠用,就加線程入池直至maximumPoolSize大小,如果還不夠就往workQueue里加,如果workQueue也不夠就用RejectedExecutionHandler來做拒絕處理。
但實際情況不是這樣,具體流程如下:
1)當池子大小小于corePoolSize就新建線程,并處理請求
2)當池子大小等于corePoolSize,把請求放入workQueue中,池子里的空閑線程就去從workQueue中取任務(wù)并處理
3)當workQueue放不下新入的任務(wù)時,新建線程入池,并處理請求,如果池子大小撐到了maximumPoolSize就用RejectedExecutionHandler來做拒絕處理
4)另外,當池子的線程數(shù)大于corePoolSize的時候,多余的線程會等待keepAliveTime長的時間,如果無請求可處理就自行銷毀
內(nèi)部結(jié)構(gòu)如下所示:
從中可以發(fā)現(xiàn)ThreadPoolExecutor就是依靠BlockingQueue的阻塞機制來維持線程池,當池子里的線程無事可干的時候就通過workQueue.take()阻塞住。
其實可以通過Executes來學(xué)學(xué)幾種特殊的ThreadPoolExecutor是如何構(gòu)建的。
?
[java]?view plaincopy?
newFixedThreadPool就是一個固定大小的ThreadPool
?
[java]?view plaincopy?
newCachedThreadPool比較適合沒有固定大小并且比較快速就能完成的小任務(wù),沒必要維持一個Pool,這比直接new Thread來處理的好處是能在60秒內(nèi)重用已創(chuàng)建的線程。
其他類型的ThreadPool看看構(gòu)建參數(shù)再結(jié)合上面所說的特性就大致知道它的特性
轉(zhuǎn)載于:https://www.cnblogs.com/hnucdj/p/4583780.html
總結(jié)
以上是生活随笔為你收集整理的ThreadPoolExecutor运转机制详解(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 已有打开的与此 Command 相关联的
- 下一篇: Tuxedo学习门户网站