java 線程池

ThreadPoolExecutor 用于創(chuàng)建線程池荧飞,它有 4 個重載構(gòu)造器,我們以最多參數(shù)的構(gòu)造器講解:

ThreadPoolExecutor(int corePoolSize,                    # 線程池核心線程個數(shù)豺型,默認線程池線程個數(shù)為 0,只有接到任務(wù)才新建線程
                   int maximumPoolSize,                 # 線程池最大線程數(shù)量
                   long keepAliveTime,                  # 線程池空閑時绑咱,線程存活的時間爵嗅,當(dāng)線程池中的線程數(shù)大于 corePoolSize 時才會起作用
                   TimeUnit unit,                       # 時間單位
                   BlockingQueue<Runnable> workQueue,   # 阻塞隊列,當(dāng)達到線程數(shù)達到 corePoolSize 時疲恢,將任務(wù)放入隊列等待線程處理
                   ThreadFactory threadFactory,         # 線程工廠
                   RejectedExecutionHandler handler)    # 線程拒絕策略凶朗,當(dāng)隊列滿了并且線程個數(shù)達到 maximumPoolSize 后采取的策略

阻塞隊列有以下 4 種:

ArrayBlockingQueue:基于數(shù)組、有界显拳,按 FIFO(先進先出)原則對元素進行排序棚愤;
LinkedBlockingQueue:基于鏈表,按FIFO (先進先出) 排序元素杂数,吞吐量通常要高于 ArrayBlockingQueue宛畦;
SynchronousQueue:每個插入操作必須等到另一個線程調(diào)用移除操作,否則插入操作一直處于阻塞狀態(tài)揍移,吞吐量通常要高于 LinkedBlockingQueue次和;
PriorityBlockingQueue:具有優(yōu)先級的、無限阻塞隊列羊精。

線程拒絕策略有以下 4 種:

CallerRunsPolicy:如果發(fā)現(xiàn)線程池還在運行斯够,就直接運行這個線程;
DiscardOldestPolicy:在線程池的等待隊列中,將頭取出一個拋棄喧锦,然后將當(dāng)前線程放進去;
DiscardPolicy:默默丟棄,不拋出異常;
AbortPolicy:java默認读规,拋出一個異常(RejectedExecutionException)。

實現(xiàn)原則:

如果當(dāng)前池大小 poolSize 小于 corePoolSize 燃少,則創(chuàng)建新線程執(zhí)行任務(wù)束亏;
如果當(dāng)前池大小 poolSize 大于 corePoolSize ,且等待隊列未滿阵具,則進入等待隊列碍遍;
如果當(dāng)前池大小 poolSize 大于 corePoolSize 且小于 maximumPoolSize 定铜,且等待隊列已滿,則創(chuàng)建新線程執(zhí)行任務(wù)怕敬;
如果當(dāng)前池大小 poolSize 大于 corePoolSize 且大于 maximumPoolSize 揣炕,且等待隊列已滿,則調(diào)用拒絕策略來處理該任務(wù)东跪;
線程池里的每個線程執(zhí)行完任務(wù)后不會立刻退出畸陡,而是會去檢查下等待隊列里是否還有線程任務(wù)需要執(zhí)行,如果在 keepAliveTime 里等不到新的任務(wù)了虽填,那么線程就會退出丁恭。

2.2.3 內(nèi)置線程池

在 java.util.concurrent 包中已經(jīng)提供為大多數(shù)使用場景的內(nèi)置線程池:

Executors.newSingleThreadExecutor()     # 單條線程
Executors.newFixedThreadPool(int n)     # 固定數(shù)目線程的線程池
Executors.newCachedThreadPool()         # 創(chuàng)建一個可緩存的線程池,調(diào)用execute 將重用以前構(gòu)造的線程(如果線程可用)斋日。如果現(xiàn)有線程沒有可用的牲览,則創(chuàng)建一個新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程恶守。
Executors.newScheduledThreadPool(int n) # 支持定時及周期性的任務(wù)執(zhí)行的線程池第献,多數(shù)情況下可用來替代 Timer 類。

上述 4 種線程池底層都是通過創(chuàng)建 ThreadPoolExecutor 獲取線程池熬的。

  1. newSingleThreadExecutor
    主要用于串行(順序執(zhí)行)操作場景痊硕。

  2. newFixedThreadPool
    主要用于負載比較重的場景,為了資源的合理利用押框,需要限制當(dāng)前線程數(shù)量岔绸。

  3. newCachedThreadPool
    主要用于并發(fā)執(zhí)行大量短期的小任務(wù),或者是負載較輕的服務(wù)器橡伞。

  4. newScheduledThreadPool
    ScheduledExecutorService 繼承 ThreadPoolExecutor盒揉。

2.2.4 提交任務(wù)

獲取 ExecutorService 對象后,我們需要提交任務(wù)來讓線程池中的線程執(zhí)行兑徘,提交任務(wù)的方法有 2 種:

       #  void execute():提交不需要返回值的任務(wù)
       pool.execute(() -> System.out.println("1L"));
       # Future<T> submit(): 提交需要返回值的任務(wù)
        Future<Long> future = pool.submit(() -> {
            System.out.println("1L");
            return 1L;
        });
        Long result = future.get();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刚盈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挂脑,更是在濱河造成了極大的恐慌藕漱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崭闲,死亡現(xiàn)場離奇詭異肋联,居然都是意外死亡,警方通過查閱死者的電腦和手機刁俭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門橄仍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事侮繁÷侵啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵宪哩,是天一觀的道長娩贷。 經(jīng)常有香客問我,道長斋射,這世上最難降的妖魔是什么育勺? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮罗岖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腹躁。我一直安慰自己桑包,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布纺非。 她就那樣靜靜地躺著哑了,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烧颖。 梳的紋絲不亂的頭發(fā)上弱左,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音炕淮,去河邊找鬼拆火。 笑死,一個胖子當(dāng)著我的面吹牛涂圆,可吹牛的內(nèi)容都是我干的们镜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼润歉,長吁一口氣:“原來是場噩夢啊……” “哼模狭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起踩衩,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嚼鹉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驱富,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锚赤,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年萌朱,在試婚紗的時候發(fā)現(xiàn)自己被綠了宴树。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晶疼,死狀恐怖酒贬,靈堂內(nèi)的尸體忽然破棺而出又憨,到底是詐尸還是另有隱情,我是刑警寧澤锭吨,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布蠢莺,位于F島的核電站,受9級特大地震影響零如,放射性物質(zhì)發(fā)生泄漏躏将。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一考蕾、第九天 我趴在偏房一處隱蔽的房頂上張望祸憋。 院中可真熱鬧,春花似錦肖卧、人聲如沸蚯窥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拦赠。三九已至,卻和暖如春葵姥,著一層夾襖步出監(jiān)牢的瞬間荷鼠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工榔幸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留允乐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓牡辽,卻偏偏與公主長得像喳篇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子态辛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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