<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    ThreadPoolExecutor運轉機制詳解 .

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

    最近發現幾起對ThreadPoolExecutor的誤用,其中包括自己,發現都是因為沒有仔細看注釋和內部運轉機制,想當然的揣測參數導致,先看一下新建一個ThreadPoolExecutor的構建參數:

     

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

     

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

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

     

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

    內部結構如下所示:

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

    其實可以通過Executes來學學幾種特殊的ThreadPoolExecutor是如何構建的。

     

    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秒內重用已創建的線程。

    其他類型的ThreadPool看看構建參數再結合上面所說的特性就大致知道它的特性
    轉載自:http://blog.csdn.net/cutesource/article/details/6061229

    主站蜘蛛池模板: 亚洲天堂中文字幕在线| 国产精品公开免费视频| 亚洲av永久无码精品古装片 | 亚洲国产成人va在线观看网址| 久久精品乱子伦免费| 亚洲成色999久久网站| 久久精品私人影院免费看| 97se亚洲综合在线| 麻豆一区二区免费播放网站| 亚洲偷自精品三十六区| 四虎影视大全免费入口| 校园亚洲春色另类小说合集| 亚洲国产日韩在线观频| 免费无码又爽又刺激一高潮| 久久久久亚洲AV片无码下载蜜桃| 1000部国产成人免费视频| 亚洲天然素人无码专区| 免费a级毛片无码av| 国产激情久久久久影院老熟女免费| 亚洲精品午夜无码电影网| 99精品视频在线视频免费观看| 亚洲午夜在线一区| 国产又粗又猛又爽又黄的免费视频| 色吊丝性永久免费看码| 久久青青草原亚洲AV无码麻豆 | 久久亚洲最大成人网4438| 国产自产拍精品视频免费看| 久久久久久噜噜精品免费直播| 亚洲av激情无码专区在线播放| 国产福利在线免费| 猫咪www免费人成网站| 久久久久亚洲av无码专区蜜芽| 国产日本一线在线观看免费| 国产亚洲精品精品精品| 亚洲bt加勒比一区二区| 免费观看男人免费桶女人视频| 成人国产精品免费视频| 色在线亚洲视频www| 亚洲线精品一区二区三区| 亚洲欧洲免费无码| 国产人成网在线播放VA免费|