創(chuàng)建線程池詳解

線程池的特點,優(yōu)勢,創(chuàng)建

特點

用線程池控制運行線程的數(shù)量, 將處理中的線程任務(wù)放入隊列, 線程創(chuàng)建后啟動這些任務(wù), 當(dāng)線程超出最大數(shù)量的時候, 進入隊列排隊, 等其他線程執(zhí)行完畢,再從隊列中取出任務(wù)執(zhí)行.

優(yōu)勢

  1. 降低資源消耗, 重復(fù)利用線程, 降低線程創(chuàng)建與銷毀的消耗
  2. 提供響應(yīng)速度, 當(dāng)任務(wù)到達時, 任務(wù)不需要等待線程創(chuàng)建, 可以立即執(zhí)行
  3. 提高線程管理, 統(tǒng)一分配, 調(diào)優(yōu), 監(jiān)控
  4. 合理使用線程池可以防止處理OOM問題

創(chuàng)建

阿里編碼規(guī)范.png

ThreadPoolExecutors線程池7大參數(shù)

  1. corePoolSize: 線程池中的核心線程數(shù)
  2. maximumPoolSize: 最大線程數(shù), 必須大于1
  3. keepAliveTime: 多余的空閑時間
  4. unit: keepAliveTime單位
  5. queueCapacity: 任務(wù)隊列
  6. threadFactory: 線程池中線程工廠
  7. rejectedExecutionHandler: 拒絕策略

ThreadPoolExecutors線程池4種拒絕策略

  1. AbortPolicy(默認): 直接拋異常
  2. CallerRunsPolicy: "調(diào)用者運行"一種調(diào)試機制, 將任務(wù)返回調(diào)用者
  3. DiscardOldestPolicy: 拋棄隊列中等待最久的任務(wù)
  4. DiscardPolicy: 直接丟棄任務(wù)

ThreadPoolExector線程池原理分析

public class ThreadPoolExecutorTest {
    private static ThreadPoolExecutor executor =
            new ThreadPoolExecutor(
                    2,  // 核心線程數(shù)2
                    5, // 最大線程數(shù)5
                    4,
                    TimeUnit.MILLISECONDS,
                     new ArrayBlockingQueue<Runnable>(4)); // 隊列數(shù)4

    public static void main(String[] args) throws InterruptedException {
        for (int i = 1; i < 15; i++) {
            final String b = String.valueOf(i);
                    TimeUnit.MILLISECONDS.sleep(100);
            executor.execute(() -> {
                System.out.println(Thread.currentThread().getName() + ": " + b);
               try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        TimeUnit.SECONDS.sleep(20);
    }
}
執(zhí)行結(jié)果.png

線程池工作原理.png

線程池合理配置線程數(shù)

1)根據(jù)幾個值來決定
(1) tasks: 每秒的任務(wù)數(shù), 假設(shè)100 ~ 1000
(2) taskcost: 每個任務(wù)花費時間: 假設(shè)0.1s
(3) responsetime: 系統(tǒng)允許最大響應(yīng)時間, 假設(shè)1s

2)根據(jù)8020定律, corePoolSize計算:
任何一組東西中茎活,最重要的只占其中一小部分,約20%琢唾,其余80%盡管是多數(shù)载荔,卻是次要的,因此又稱二八定律
corePoolSize = tasks* taskcout = (100 ~ 1000) * 0.1 = 10 ~ 100
8020定律, 核心線程數(shù)為20

3)queueCapacity計算:
任務(wù)隊列的長度要根據(jù)核心線程數(shù)慧耍,以及系統(tǒng)對任務(wù)響應(yīng)時間的要求有關(guān)身辨。隊列長度可以設(shè)置為
queueCapacity = corePoolSize / taskcost * responsetime = 20 / 0.1 * 1 = 200
注: 若將隊列長度設(shè)置為Integer.MAX_VALUE,將會導(dǎo)致線程數(shù)量永遠為corePoolSize芍碧,再也不會增加煌珊,當(dāng)任務(wù)數(shù)量陡增時,任務(wù)響應(yīng)時間也將隨之陡增

4)maxPoolSize計算:
當(dāng)系統(tǒng)負載達到最大值時泌豆,核心線程數(shù)已無法按時處理完所有任務(wù)定庵,這時就需要增加線程
maxPoolSize = (max(sasks) - queueCapacity) * taskcost = (1000 -200) * 0.1 = 80

  1. rejectedExecutionHandler:根據(jù)具體情況來決定,任務(wù)不重要可丟棄,任務(wù)重要則要利用一些緩沖機制來處理

6)keepAliveTime和unit采用默認通常能滿足

合理創(chuàng)建線程池

 ThreadPoolExecutor executor =
            new ThreadPoolExecutor(
                    20, //核心線程數(shù)
                    80,  //最大線程數(shù)
                    1,  // 多余的空閑時間
                    TimeUnit.SECONDS, //多余的空閑時間單位
                    new ArrayBlockingQueue<>(200) //隊列長度 
                    ,new ThreadFactoryBuilder().setNameFormat("xx-pool-%d").build(), //創(chuàng)建
                    new ThreadPoolExecutor.DiscardPolicy()  //處理策略

            );
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔬浙,一起剝皮案震驚了整個濱河市猪落,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畴博,老刑警劉巖笨忌,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俱病,居然都是意外死亡官疲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門亮隙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來途凫,“玉大人,你說我怎么就攤上這事溢吻∥眩” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵促王,是天一觀的道長犀盟。 經(jīng)常有香客問我,道長硼砰,這世上最難降的妖魔是什么且蓬? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任欣硼,我火速辦了婚禮题翰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诈胜。我一直安慰自己豹障,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布焦匈。 她就那樣靜靜地躺著血公,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缓熟。 梳的紋絲不亂的頭發(fā)上累魔,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音够滑,去河邊找鬼垦写。 笑死,一個胖子當(dāng)著我的面吹牛彰触,可吹牛的內(nèi)容都是我干的梯投。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼分蓖!你這毒婦竟也來了尔艇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤么鹤,失蹤者是張志新(化名)和其女友劉穎终娃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸甜,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡尝抖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迅皇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昧辽。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖登颓,靈堂內(nèi)的尸體忽然破棺而出搅荞,到底是詐尸還是另有隱情,我是刑警寧澤框咙,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布咕痛,位于F島的核電站,受9級特大地震影響喇嘱,放射性物質(zhì)發(fā)生泄漏茉贡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一者铜、第九天 我趴在偏房一處隱蔽的房頂上張望腔丧。 院中可真熱鬧,春花似錦作烟、人聲如沸愉粤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衣厘。三九已至,卻和暖如春压恒,著一層夾襖步出監(jiān)牢的瞬間影暴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工探赫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留型宙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓期吓,卻偏偏與公主長得像早歇,于是被迫代替她去往敵國和親倾芝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容