Java線程池

線程池的優(yōu)點(diǎn)

①降低系統(tǒng)資源消耗,通過重用已存在的線程碳却,降低線程創(chuàng)建和銷毀造成的消耗;
②提高系統(tǒng)響應(yīng)速度笑旺,當(dāng)有任務(wù)到達(dá)時(shí)昼浦,無需等待新線程的創(chuàng)建便能立即執(zhí)行;
③方便線程并發(fā)數(shù)的管控筒主,線程若是無限制的創(chuàng)建关噪,不僅會額外消耗大量系統(tǒng)資源鸟蟹,更是占用過多資源而阻塞系統(tǒng)或oom等狀況,從而降低系統(tǒng)的穩(wěn)定性使兔。線程池能有效管控線程建钥,統(tǒng)一分配、調(diào)優(yōu)火诸,提供資源使用率锦针;
④更強(qiáng)大的功能,線程池提供了定時(shí)置蜀、定期以及可控線程數(shù)等功能的線程池奈搜,使用方便簡單。

參考

線程池的創(chuàng)建

使用ThreadPoolExecutor創(chuàng)建

    ExecutorService service = new ThreadPoolExecutor(....);

下面我們就來看一下ThreadPoolExecutor中的一個(gè)構(gòu)造方法盯荤。

 public ThreadPoolExecutor(int corePoolSize,
     int maximumPoolSize,
     long keepAliveTime,
     TimeUnit unit,
     BlockingQueue<Runnable> workQueue,
     ThreadFactory threadFactory,
     RejectedExecutionHandler handler)

ThreadPollExcutor參數(shù)含義

**1. corePoolSize **
線程池中的核心線程馋吗,一般情況下,核心線程一直存活在線程池中秋秤。

2. maximumPoolSize
線程池中的最大線程數(shù)宏粤。當(dāng)活動線程數(shù)大于這個(gè)值,后續(xù)的新任務(wù)將阻塞灼卢,包括核心線程和非核心線程绍哎。

3. keepAliveTime
非核心線程限制的超時(shí)時(shí)間,當(dāng)非核心線程閑置時(shí)間超過這個(gè)值鞋真,非核心線程就會被回收崇堰。

4. unit

用于指定keepAliveTime參數(shù)的時(shí)間單位。他是一個(gè)枚舉涩咖,可以使用的單位有天(TimeUnit.DAYS)海诲,小時(shí)(TimeUnit.HOURS),分鐘(TimeUnit.MINUTES)檩互,毫秒(TimeUnit.MILLISECONDS)特幔,微秒(TimeUnit.MICROSECONDS, 千分之一毫秒)和毫微秒(TimeUnit.NANOSECONDS, 千分之一微秒);

** 5. workQueue**
線程池中保存等待任務(wù)的阻塞隊(duì)列。

阻塞隊(duì)列 說明
ArrayBlockingQueue 基于數(shù)組實(shí)現(xiàn)的有界的阻塞隊(duì)列,該隊(duì)列按照FIFO(先進(jìn)先出)原則對隊(duì)列中的元素進(jìn)行排序闸昨。
LinkedBlockingQueue 基于鏈表實(shí)現(xiàn)的阻塞隊(duì)列蚯斯,該隊(duì)列按照FIFO(先進(jìn)先出)原則對隊(duì)列中的元素進(jìn)行排序。
SynchronousQueue 內(nèi)部沒有任何容量的阻塞隊(duì)列饵较。在它內(nèi)部沒有任何的緩存空間溉跃。對于SynchronousQueue中的數(shù)據(jù)元素只有當(dāng)我們試著取走的時(shí)候才可能存在。
PriorityBlockingQueue 具有優(yōu)先級的無限阻塞隊(duì)列告抄。

我們還能夠通過實(shí)現(xiàn)BlockingQueue接口來自定義我們所需要的阻塞隊(duì)列。

6. ThreadFactory

線程工廠嵌牺,為線程池提供新線程的創(chuàng)建打洼。ThreadFactory是一個(gè)接口龄糊,里面只有一個(gè)newThread方法。 默認(rèn)為DefaultThreadFactory類募疮。

對于ThreadPoolExecutor有多個(gè)構(gòu)造方法炫惩,對于上面的構(gòu)造方法中的其他參數(shù)都采用默認(rèn)值“⑴ǎ可以通過executesubmit兩種方式來向線程池提交一個(gè)任務(wù)他嚷。 execute 當(dāng)我們使用execute來提交任務(wù)時(shí),由于execute方法沒有返回值芭毙,所以說我們也就無法判定任務(wù)是否被線程池執(zhí)行成功筋蓖。

submit

當(dāng)我們使用submit來提交任務(wù)時(shí),它會返回一個(gè)future,我們就可以通過這個(gè)future來判斷任務(wù)是否執(zhí)行成功,還可以通過future的get方法來獲取返回值退敦。如果子線程任務(wù)沒有完成粘咖,get方法會阻塞住直到任務(wù)完成,而使用get(long timeout, TimeUnit unit)方法則會阻塞一段時(shí)間后立即返回侈百,這時(shí)候有可能任務(wù)并沒有執(zhí)行完瓮下。

線程池關(guān)閉

調(diào)用線程池的shutdown()或shutdownNow()方法來關(guān)閉線程池
shutdown原理:將線程池狀態(tài)設(shè)置成SHUTDOWN狀態(tài),然后中斷所有沒有正在執(zhí)行任務(wù)的線程钝域。
shutdownNow原理:將線程池的狀態(tài)設(shè)置成STOP狀態(tài)讽坏,然后中斷所有任務(wù)(包括正在執(zhí)行的)的線程,并返回等待執(zhí)行任務(wù)的列表例证。
中斷采用interrupt方法路呜,所以無法響應(yīng)中斷的任務(wù)可能永遠(yuǎn)無法終止。 但調(diào)用上述的兩個(gè)關(guān)閉之一战虏,isShutdown()方法返回值為true拣宰,當(dāng)所有任務(wù)都已關(guān)閉,表示線程池關(guān)閉完成烦感,則isTerminated()方法返回值為true巡社。當(dāng)需要立刻中斷所有的線程,不一定需要執(zhí)行完任務(wù)手趣,可直接調(diào)用shutdownNow()方法晌该。

一個(gè)線程不應(yīng)該由其他線程來強(qiáng)制中斷或停止,而是應(yīng)該由線程自己自行停止绿渣。所以朝群,Thread.stop, Thread.suspend, Thread.resume 都已經(jīng)被廢棄了。而 Thread.interrupt 的作用其實(shí)也不是中斷線程中符,而是「通知線程應(yīng)該中斷了」姜胖,具體到底中斷還是繼續(xù)運(yùn)行,應(yīng)該由被通知的線程自己處理淀散。

Java四種線程池

Java中四種具有不同功能常見的線程池右莱。他們都是直接或者間接配置ThreadPoolExecutor來實(shí)現(xiàn)他們各自的功能蚜锨。這四種線程池分別是newFixedThreadPool,newCachedThreadPool,newScheduledThreadPool和newSingleThreadExecutor。這四個(gè)線程池可以通過Executors類獲取慢蜓。

1. newFixedThreadPool
該線程池是線程數(shù)量固定的線程池亚再。NewFixedThreadPool只有核心線程,而且這些線程不會被銷毀晨抡。

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
        0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>());
}

2. newCachedThreadPool

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

該線程的核心線程數(shù)為0氛悬,最大線程數(shù)量為無限。

3. newScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
    return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
          new DelayedWorkQueue());
}

該線程的核心線程數(shù)是固定的耘柱,非核心線程數(shù)是無限的如捅,當(dāng)非核心線程數(shù)限制時(shí)間超過了,就會被回收帆谍。
該線程可創(chuàng)建延時(shí)或者定時(shí)線程任務(wù)伪朽。

ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
service.schedule(new Runnable() {
    public void run() {
        System.out.println(Thread.currentThread().getName()+"延遲三秒執(zhí)行");
    }
}, 3, TimeUnit.SECONDS);
service.scheduleAtFixedRate(new Runnable() {
    public void run() {
        System.out.println(Thread.currentThread().getName()+"延遲三秒后每隔2秒執(zhí)行");
    }
}, 3, 2, TimeUnit.SECONDS);

4. newSingleThreadExecutor

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
    (new ThreadPoolExecutor(1, 1,
        0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>()));
}

該線程池的核心線程和最大線程數(shù)都是1,表示這個(gè)線程的活動線程永遠(yuǎn)都只有一個(gè)汛蝙,且不會被回收烈涮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窖剑,隨后出現(xiàn)的幾起案子坚洽,更是在濱河造成了極大的恐慌,老刑警劉巖西土,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讶舰,死亡現(xiàn)場離奇詭異,居然都是意外死亡需了,警方通過查閱死者的電腦和手機(jī)跳昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肋乍,“玉大人鹅颊,你說我怎么就攤上這事∧乖欤” “怎么了堪伍?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長觅闽。 經(jīng)常有香客問我帝雇,道長,這世上最難降的妖魔是什么蛉拙? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任尸闸,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘室叉。我一直安慰自己睹栖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布茧痕。 她就那樣靜靜地躺著,像睡著了一般恼除。 火紅的嫁衣襯著肌膚如雪踪旷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天豁辉,我揣著相機(jī)與錄音令野,去河邊找鬼。 笑死徽级,一個(gè)胖子當(dāng)著我的面吹牛气破,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播餐抢,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼现使,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旷痕?” 一聲冷哼從身側(cè)響起碳锈,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欺抗,沒想到半個(gè)月后售碳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绞呈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年贸人,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佃声。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艺智,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秉溉,到底是詐尸還是另有隱情力惯,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布召嘶,位于F島的核電站父晶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弄跌。R本人自食惡果不足惜甲喝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铛只。 院中可真熱鬧埠胖,春花似錦糠溜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谋竖,卻和暖如春红柱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓖乘。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工锤悄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘉抒。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓零聚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親些侍。 傳聞我的和親對象是個(gè)殘疾皇子隶症,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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

  • 聽:經(jīng)典兒歌5首/拼讀兒歌6首 說:哼唱的1首 讀:raz繪本5本。其它1本娩梨。 寫:玩P 綜合:外教課2節(jié)沿腰。 這周...
    左左camille閱讀 301評論 0 0
  • 成長仿佛只是一瞬間的過程。 如果真的要這么狠心的話狈定,這所有的苦澀都該我一個(gè)人品嘗颂龙。 揪心的青春,再也回不去了纽什。 那...
    七月的小七閱讀 143評論 0 0
  • 深夜措嵌。 淚匣子被你打開, 止不住的流芦缰。 沒有原因企巢, 只是很想你。 這大概就是思念的滋味吧让蕾。 分別不到24個(gè)小時(shí)浪规, ...
    刺猬的走心獨(dú)白閱讀 311評論 0 1
  • 腐敗的一天。外食探孝,電影笋婿,書店閑晃,淘寶亂逛顿颅。
    小怪獸齊火丁閱讀 190評論 0 3
  • 大概是松子的一生觸動了我心靈深處某個(gè)隱晦的傷口缸濒,而這種傷痛來的如此銳利而清晰,讓我在這樣一個(gè)深夜哽咽不止… ...
    瓊喑閱讀 359評論 0 5