java 四大線程池

new Thread 的弊端

首先看一段代碼:

public class ThreadTest {

? ? public static void main(String[] args) {

? ? ? ? while (true) {

? ? ? ? ? ? new Thread(new Runnable() {

? ? ? ? ? ? ? ? @Override? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? System.out.println(Thread.currentThread());

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }).start();

? ? ? ? }

? ? }

}

Thread[Thread-0,5,main]

Thread[Thread-4,5,main]

Thread[Thread-3,5,main]

Thread[Thread-6,5,main]

Thread[Thread-7,5,main]

先說一下此處的打印忱详,第一個參數(shù)是當(dāng)前線程名稱廊遍,由于線程之間是異步執(zhí)行搁吓,有的還沒創(chuàng)建好饰潜,有的后來居上就執(zhí)行完了寓免,導(dǎo)致打印線程的名稱會這樣呈驶,第二個參數(shù)是優(yōu)先級捂掰,默認都是5羡鸥,第三個參數(shù)是線程組名稱蜈块。

如果不停止程序鉴腻,這段代碼會不斷創(chuàng)建和銷毀線程,直到死機或者OOM百揭,更尷尬的是此處的線程爽哎,還無法主動去中斷。

上述的線程啟動方式在日常開發(fā)中經(jīng)称饕唬看到的课锌,但是從性能和優(yōu)化的角度來說,問題還真不小祈秕。

每次都新建渺贤,性能較差(這個在線程池原理中有詳細講解)雏胃。

線程缺乏統(tǒng)一管理,可能無限制的創(chuàng)建線程志鞍,互相競爭瞭亮,會帶來一些不必要的麻煩。

可控性太差固棚,比如定時定期執(zhí)行统翩,比如線程中斷機制

線程池的優(yōu)點

Java提供了四大線程池玻孟,主要針對new Thread的弊端講述優(yōu)點:

降低資源消耗唆缴,不需要每次都是新建和銷毀鳍征,性能得到了提高黍翎。

統(tǒng)一管理,可有效控制最大并發(fā)量艳丛,提高系統(tǒng)資源的使用率匣掸,同時避免過多資源競爭,避免堵塞氮双。

可控性很好碰酝,可以定期定時執(zhí)行、線程中斷機制等戴差。

newCachedThreadPool

newCachedThreadPool:創(chuàng)建帶有緩存的線程池送爸。

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class ThreadTest {

? ? public static void main(String[] args) {

? ? ? ? test();

? ? }

? ? private static void test(){

? ? ? ? ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

? ? ? ? for (int i = 0; i < 100; i++) {

? ? ? ? ? ? cachedThreadPool.execute(new Runnable() {

? ? ? ? ? ? ? ? @Override? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? System.out.println(Thread.currentThread());

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }

? ? }

}

Thread[pool-1-thread-2,5,main]

Thread[pool-1-thread-4,5,main]

Thread[pool-1-thread-3,5,main]

Thread[pool-1-thread-6,5,main]

由此可見,上述線程在新建的同時暖释,還有部分線程被回收后再利用袭厂,剛剛做了下測試,在每次打印之前加了2ms的延遲球匕,打印的都是“Thread[pool-1-thread-1,5,main]”纹磺。

線程池為無限大(其實是Interger. MAX_VALUE),當(dāng)執(zhí)行第二個任務(wù)時第一個任務(wù)已經(jīng)完成亮曹,會復(fù)用執(zhí)行第一個任務(wù)的線程橄杨,而不用每次新建線程,如果線程池長度超過處理需要照卦,可靈活回收空閑線程式矫,若無可回收,則新建線程役耕。

newFixedThreadPool

newFixedThreadPool:創(chuàng)建一個定長線程池衷佃,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待蹄葱。

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class ThreadTest {

? ? public static void main(String[] args) {

? ? ? ? test();

? ? }

? ? private static void test(){

? ? ? ? ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

? ? ? ? for (int i = 0; i < 100; i++) {

? ? ? ? ? ? fixedThreadPool.execute(new Runnable() {

? ? ? ? ? ? ? ? @Override? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? System.out.println(Thread.currentThread());

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }

? ? }

}

Thread[pool-1-thread-2,5,main]

Thread[pool-1-thread-3,5,main]

Thread[pool-1-thread-1,5,main]

Thread[pool-1-thread-3,5,main]

Thread[pool-1-thread-3,5,main]

此處配置最大的線程長度是3氏义,由打印可看出锄列,此處始終在三個線程中執(zhí)行。

newScheduledThreadPool

newScheduledThreadPool:支持定時和周期性執(zhí)行的線程池惯悠。

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class ThreadTest {

? ? public static void main(String[] args) {

? ? ? ? test();

? ? }

? ? private static void test(){

? ? ? ? ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

? ? ? ? /**

? ? ? ? * 延遲3秒執(zhí)行

? ? ? ? */? ? ? ? scheduledThreadPool.schedule(new Runnable() {

? ? ? ? ? ? @Override? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? System.out.println(Thread.currentThread());

? ? ? ? ? ? }

? ? ? ? }, 3000, TimeUnit.MILLISECONDS);

? ? ? ? /**

? ? ? ? * 延遲1秒后每3秒執(zhí)行一次

? ? ? ? */? ? ? ? scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

? ? ? ? ? ? @Override? ? ? ? ? ?

????????????public void run() {

? ? ? ? ? ? ? ? System.out.println(Thread.currentThread());

? ? ? ? ? ? }

? ? ? ? }, 1, 3000, TimeUnit.MILLISECONDS);

? ? }

}

Thread[pool-1-thread-1,5,main]

Thread[pool-1-thread-1,5,main]

Thread[pool-1-thread-2,5,main]

Thread[pool-1-thread-1,5,main].

此方法無論任務(wù)執(zhí)行時間長短邻邮,都是當(dāng)?shù)谝粋€任務(wù)執(zhí)行完成之后,延遲指定時間再開始執(zhí)行第二個任務(wù)克婶。

在日常開發(fā)中筒严,newScheduledThreadPool可以作為timer的替代品,對比timer情萤,newScheduledThreadPool更安全更強大鸭蛙。

newSingleThreadExecutor

newSingleThreadExecutor:從名稱上便可以看出,此線程池是一個單線程化的線程池筋岛,它只會用唯一的工作線程來執(zhí)行任務(wù)娶视,保證所有任務(wù)按照指定順序。如果這個線程異常結(jié)束睁宰,會有另一個取代它肪获,保證順序執(zhí)行(我覺得這點是它的特色)。

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class ThreadTest {

? ? public static void main(String[] args) {

? ? ? ? test();

? ? }

? ? private static void test(){

? ? ? ? ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

? ? ? ? for (int i = 0; i < 100; i++) {

? ? ? ? ? ? singleThreadExecutor.execute(new Runnable() {

? ? ? ? ? ? ? ? @Override? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? System.out.println(Thread.currentThread());

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }

? ? }

}

得到的結(jié)果會一直是“Thread[pool-1-thread-1,5,main]”柒傻。

總結(jié):對于任務(wù)量少或者只有一個任務(wù)的情況下孝赫,此時使用線程池顯得高射炮打蚊子了,但是對于任務(wù)量多红符,單個任務(wù)處理的時間比較短的情況下青柄,你會對線程池有不一樣的體會和好感。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末预侯,一起剝皮案震驚了整個濱河市致开,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雌桑,老刑警劉巖喇喉,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異校坑,居然都是意外死亡拣技,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門耍目,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膏斤,“玉大人,你說我怎么就攤上這事邪驮∧妫” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沮榜。 經(jīng)常有香客問我盘榨,道長,這世上最難降的妖魔是什么蟆融? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任草巡,我火速辦了婚禮,結(jié)果婚禮上型酥,老公的妹妹穿的比我還像新娘山憨。我一直安慰自己,他們只是感情好弥喉,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布郁竟。 她就那樣靜靜地躺著,像睡著了一般由境。 火紅的嫁衣襯著肌膚如雪棚亩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天藻肄,我揣著相機與錄音蔑舞,去河邊找鬼拒担。 笑死嘹屯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的从撼。 我是一名探鬼主播州弟,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼低零!你這毒婦竟也來了婆翔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤掏婶,失蹤者是張志新(化名)和其女友劉穎啃奴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雄妥,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡最蕾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了老厌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘟则。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枝秤,靈堂內(nèi)的尸體忽然破棺而出醋拧,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布丹壕,位于F島的核電站庆械,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菌赖。R本人自食惡果不足惜干奢,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盏袄。 院中可真熱鬧忿峻,春花似錦、人聲如沸辕羽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刁愿。三九已至绰寞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铣口,已是汗流浹背滤钱。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脑题,地道東北人件缸。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像叔遂,于是被迫代替她去往敵國和親他炊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 進程和線程 進程 所有運行中的任務(wù)通常對應(yīng)一個進程,當(dāng)一個程序進入內(nèi)存運行時,即變成一個進程.進程是處于運行過程中...
    勝浩_ae28閱讀 5,085評論 0 23
  • 今天我們來聊聊Java多線程的問題已艰,多線程在并發(fā)編程中尤其重要痊末,從jdk1.0引入的Thread 類和Runabl...
    長道閱讀 3,959評論 2 20
  • 1、new Thread的弊端 執(zhí)行一個異步任務(wù)你還只是如下new Thread嗎哩掺? ``` new Thread...
    Jannonx閱讀 2,758評論 0 6
  • 一凿叠、wait--notify--sleep Object obj = new Object(); obj.wait...
    fe0180bd6eaf閱讀 330評論 0 1
  • 斜陽微影盒件,隨手而泛起的書箋,淡淡的紙香誊薄,撩動的書簽履恩,午后的閱讀撫平煩躁苦悶的心;字句行間呢蔫,感人的故事切心,飽含...
    時光不老_2679閱讀 312評論 0 1