瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          ThreadPoolExecutor運(yùn)轉(zhuǎn)機(jī)制詳解 .

          Posted on 2011-10-12 18:05 瘋狂 閱讀(1946) 評論(0)  編輯  收藏 所屬分類: java

          最近發(fā)現(xiàn)幾起對ThreadPoolExecutor的誤用,其中包括自己,發(fā)現(xiàn)都是因?yàn)闆]有仔細(xì)看注釋和內(nèi)部運(yùn)轉(zhuǎn)機(jī)制,想當(dāng)然的揣測參數(shù)導(dǎo)致,先看一下新建一個(gè)ThreadPoolExecutor的構(gòu)建參數(shù):

           

          1. public ThreadPoolExecutor(int corePoolSize,  
          2.                           int maximumPoolSize,  
          3.                           long keepAliveTime,  
          4.                           TimeUnit unit,  
          5.                           BlockingQueue<Runnable> workQueue,  
          6.                           ThreadFactory threadFactory,  
          7.                           RejectedExecutionHandler handler)  

           

          看這個(gè)參數(shù)很容易讓人以為是線程池里保持corePoolSize個(gè)線程,如果不夠用,就加線程入池直至maximumPoolSize大小,如果還不夠就往workQueue里加,如果workQueue也不夠就用RejectedExecutionHandler來做拒絕處理。

          但實(shí)際情況不是這樣,具體流程如下:

           

          1)線程池的大小>活動的線程 就放入queue,由于有空閑的線程,就不創(chuàng)建線程直接用空閑的線程處理
          2)線程池的大小<活動的線程&& 線程池的大小>=最大限制數(shù),沒有空閑的線程,但不能創(chuàng)建線程,事件入queue等待有空閑的線程,如果超時(shí),使RejectedExecutionHandler處理
          3)線程池的大小<活動的線程&& 線程池的大小<最大限制數(shù),沒有空閑線程,可以創(chuàng)建線程,直接創(chuàng)建新線程處理新事件

          內(nèi)部結(jié)構(gòu)如下所示:

          從中可以發(fā)現(xiàn)ThreadPoolExecutor就是依靠BlockingQueue的阻塞機(jī)制來維持線程池,當(dāng)池子里的線程無事可干的時(shí)候就通過workQueue.take()阻塞住。

          其實(shí)可以通過Executes來學(xué)學(xué)幾種特殊的ThreadPoolExecutor是如何構(gòu)建的。

           

          1. public static ExecutorService newFixedThreadPool(int nThreads) {  
          2.     return new ThreadPoolExecutor(nThreads, nThreads,  
          3.                                   0L, TimeUnit.MILLISECONDS,  
          4.                                   new LinkedBlockingQueue<Runnable>());  
          5. }  

           

          newFixedThreadPool就是一個(gè)固定大小的ThreadPool

           

          1. public static ExecutorService newCachedThreadPool() {  
          2.     return new ThreadPoolExecutor(0, Integer.MAX_VALUE,  
          3.                                   60L, TimeUnit.SECONDS,  
          4.                                   new SynchronousQueue<Runnable>());  
          5. }  

           

          newCachedThreadPool比較適合沒有固定大小并且比較快速就能完成的小任務(wù),沒必要維持一個(gè)Pool,這比直接new Thread來處理的好處是能在60秒內(nèi)重用已創(chuàng)建的線程。

          其他類型的ThreadPool看看構(gòu)建參數(shù)再結(jié)合上面所說的特性就大致知道它的特性
          轉(zhuǎn)載自:http://blog.csdn.net/cutesource/article/details/6061229

          主站蜘蛛池模板: 张家口市| 九江县| 宝清县| 威海市| 岚皋县| 通山县| 克山县| 塘沽区| 江川县| 昌江| 五原县| 田林县| 昌乐县| 高要市| 金塔县| 黄大仙区| 承德市| 土默特右旗| 泸西县| 理塘县| 陆良县| 平乐县| 滨州市| 益阳市| 福州市| 财经| 巴中市| 郎溪县| 石家庄市| 抚宁县| 桂林市| 九江市| 牟定县| 卢湾区| 南宁市| 平顶山市| 青铜峡市| 泗水县| 莆田市| 双鸭山市| 兰考县|