<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

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

    ThreadPoolExecutor運轉(zhuǎn)機制詳解 .

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

    最近發(fā)現(xiàn)幾起對ThreadPoolExecutor的誤用,其中包括自己,發(fā)現(xiàn)都是因為沒有仔細看注釋和內(nèi)部運轉(zhuǎn)機制,想當然的揣測參數(shù)導致,先看一下新建一個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)  

     

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

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

     

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

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

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

    其實可以通過Executes來學學幾種特殊的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就是一個固定大小的ThreadPool

     

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

     

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

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

    主站蜘蛛池模板: 日韩一区二区免费视频| 曰韩亚洲av人人夜夜澡人人爽| 自拍偷自拍亚洲精品偷一| 久久精品国产精品亚洲人人| 一级毛片免费观看不卡的| 亚洲精品乱码久久久久久V| 亚洲午夜福利AV一区二区无码| 猫咪免费人成网站在线观看| 久久精品亚洲日本波多野结衣| 国产亚洲人成无码网在线观看| 一二三四免费观看在线视频中文版| 香蕉国产在线观看免费| 亚洲国产成人久久综合一区| 亚洲成网777777国产精品| 中文字幕在线观看免费视频 | 日本免费中文字幕在线看| 99久久成人国产精品免费| 亚洲中文字幕久久久一区| 亚洲色精品vr一区二区三区| 最近中文字幕免费mv视频7| 久久精品成人免费看| 香蕉视频免费在线| 亚洲AV综合色区无码二区爱AV| a级亚洲片精品久久久久久久| 亚洲精品动漫免费二区| 三年片在线观看免费大全电影| 美女视频黄a视频全免费网站一区| 久久亚洲AV成人出白浆无码国产| 亚洲国产精品一区二区第一页免| 黄色永久免费网站| 免费一区二区三区| 一级毛片在线完整免费观看| 亚洲中文字幕无码av永久| 久久精品国产亚洲av高清漫画 | va天堂va亚洲va影视中文字幕| 亚洲欧洲日产国码无码久久99| 国产午夜鲁丝片AV无码免费| 最新欧洲大片免费在线| 84pao强力永久免费高清| 男人天堂免费视频| 一级特级aaaa毛片免费观看|