Java線程池"基本架構(gòu)"

我們知道, 在Java中創(chuàng)建線程的代價是非常昂貴的, 需要JVM和OS的配置進(jìn)行大量的處理工作:

  1. 必須為線程堆棧分配和初始化大量的內(nèi)存塊, 其中至少包含1MB的棧內(nèi)存.
  2. 需要使用JNI系統(tǒng)調(diào)用, 以便在OS中創(chuàng)建和注冊本地線程.Java委托操作系統(tǒng)線程處理Java線程

一般開發(fā)中, 我們不允許頻繁的創(chuàng)建和銷毀線程, 常用的阿里開發(fā)規(guī)范Java版不允許開發(fā)人員自行顯示的創(chuàng)建線程, 應(yīng)采用線程池減少系統(tǒng)資源開銷.

線程池的好處
a. 提升性能

線程池能獨(dú)立的負(fù)責(zé)線程的創(chuàng)建, 維護(hù)和分配. 在執(zhí)行大量的異步任務(wù)時不需要自己創(chuàng)建線程, 而是交給線程池去調(diào)度. 線程池能使用空閑的線程執(zhí)行異步任務(wù), 最大限度的提高對已經(jīng)創(chuàng)建線程的復(fù)用性, 提升性能.

b. 線程管理

每個Java線程池都有線程的管理能力. 例: 任務(wù)數(shù)量, 空閑數(shù)量, 執(zhí)行時間等信息. 對線程進(jìn)行有效的管理, 提升異步任務(wù)的高效調(diào)度.


Java線程池架構(gòu)

線程池類結(jié)構(gòu)

1. Executor接口

異步任務(wù)的"執(zhí)行者"接口, Executor提供了一個execute()來執(zhí)行已經(jīng)提交的Runnable執(zhí)行目標(biāo)實(shí)例. Executor是作為執(zhí)行者的角色, 目的是提供一種將"任務(wù)提交者"和"任務(wù)執(zhí)行者"分開的機(jī)制, 它只有一個函數(shù)式方法:

public interface Executor {
    void execute(Runnable var1);
}

2. ExecutorService

ExecutorService接口繼承自Executor, 它是異步任務(wù)的"執(zhí)行者服務(wù)"接口, 對外提供異步任務(wù)的接受者服務(wù). ExecutorService提供了接收"接收異步任務(wù)并轉(zhuǎn)交給執(zhí)行者"的方法.

public interface ExecutorService extends Executor {

    /**
     * 關(guān)閉執(zhí)行器, 主要有以下特點(diǎn):
     * 1. 已經(jīng)提交給該執(zhí)行器的任務(wù)將會繼續(xù)執(zhí)行, 但是不再接受新任務(wù)的提交;
     * 2. 如果執(zhí)行器已經(jīng)關(guān)閉了, 則再次調(diào)用沒有副作用.
     */
    void shutdown();

    /**
     * 立即關(guān)閉執(zhí)行器, 主要有以下特點(diǎn):
     * 1. 嘗試停止所有正在執(zhí)行的任務(wù), 無法保證能夠停止成功, 但會盡力嘗試(例如, 通過 Thread.interrupt中斷任務(wù), 但是不響應(yīng)中斷的任務(wù)可能無法終止);
     * 2. 暫停處理已經(jīng)提交但未執(zhí)行的任務(wù);
     *
     * @return 返回已經(jīng)提交但未執(zhí)行的任務(wù)列表
     */
    List<Runnable> shutdownNow();

    /**
     * 如果該執(zhí)行器已經(jīng)關(guān)閉, 則返回true.
     */
    boolean isShutdown();

    /**
     * 判斷執(zhí)行器是否已經(jīng)【終止】.
     * 僅當(dāng)執(zhí)行器已關(guān)閉且所有任務(wù)都已經(jīng)執(zhí)行完成, 才返回true.
     * 注意: 除非首先調(diào)用 shutdown 或 shutdownNow, 否則該方法永遠(yuǎn)返回false.
     */
    boolean isTerminated();

    /**
     * 阻塞調(diào)用線程, 等待執(zhí)行器到達(dá)【終止】狀態(tài).
     *
     * @return {@code true} 如果執(zhí)行器最終到達(dá)終止?fàn)顟B(tài), 則返回true; 否則返回false
     * @throws InterruptedException if interrupted while waiting
     */
    boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

    /**
     * 提交一個具有返回值的任務(wù)用于執(zhí)行.
     * 注意: Future的get方法在成功完成時將會返回task的返回值.
     *
     * @param task 待提交的任務(wù)
     * @param <T>  任務(wù)的返回值類型
     * @return 返回該任務(wù)的Future對象
     * @throws RejectedExecutionException 如果任務(wù)無法安排執(zhí)行
     * @throws NullPointerException       if the task is null
     */
    <T> Future<T> submit(Callable<T> task);

    /**
     * 提交一個 Runnable 任務(wù)用于執(zhí)行.
     * 注意: Future的get方法在成功完成時將會返回給定的結(jié)果(入?yún)r指定).
     *
     * @param task   待提交的任務(wù)
     * @param result 返回的結(jié)果
     * @param <T>    返回的結(jié)果類型
     * @return 返回該任務(wù)的Future對象
     * @throws RejectedExecutionException 如果任務(wù)無法安排執(zhí)行
     * @throws NullPointerException       if the task is null
     */
    <T> Future<T> submit(Runnable task, T result);

    /**
     * 提交一個 Runnable 任務(wù)用于執(zhí)行.
     * 注意: Future的get方法在成功完成時將會返回null.
     *
     * @param task 待提交的任務(wù)
     * @return 返回該任務(wù)的Future對象
     * @throws RejectedExecutionException 如果任務(wù)無法安排執(zhí)行
     * @throws NullPointerException       if the task is null
     */
    Future<?> submit(Runnable task);

    /**
     * 執(zhí)行給定集合中的所有任務(wù), 當(dāng)所有任務(wù)都執(zhí)行完成后, 返回保持任務(wù)狀態(tài)和結(jié)果的 Future 列表.
     * 
     * 注意: 該方法為同步方法. 返回列表中的所有元素的Future.isDone() 為 true.
     *
     * @param tasks 任務(wù)集合
     * @param <T>   任務(wù)的返回結(jié)果類型
     * @return 任務(wù)的Future對象列表,列表順序與集合中的迭代器所生成的順序相同煮盼,
     * @throws InterruptedException       如果等待時發(fā)生中斷, 會將所有未完成的任務(wù)取消.
     * @throws NullPointerException       任一任務(wù)為 null
     * @throws RejectedExecutionException 如果任一任務(wù)無法安排執(zhí)行
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;

    /**
     * 執(zhí)行給定集合中的所有任務(wù), 當(dāng)所有任務(wù)都執(zhí)行完成后或超時期滿時(無論哪個首先發(fā)生), 返回保持任務(wù)狀態(tài)和結(jié)果的 Future 列表.
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException;

    /**
     * 執(zhí)行給定集合中的任務(wù), 只有其中某個任務(wù)率先成功完成(未拋出異常), 則返回其結(jié)果.
     * 一旦正常或異常返回后, 則取消尚未完成的任務(wù).
     */
    <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;

    /**
     * 執(zhí)行給定集合中的任務(wù), 如果在給定的超時期滿前, 某個任務(wù)已成功完成(未拋出異常), 則返回其結(jié)果.
     * 一旦正炒郏或異常返回后, 則取消尚未完成的任務(wù).
     */
    <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

3. AbstractExecutorService

AbstractExecutorService是一個抽象類, 它實(shí)現(xiàn)了ExecutorService接口.
AbstractExecutorService存在的目的是為ExecutorService中的接口提供默認(rèn)實(shí)現(xiàn)

4. ThreadPoolExecutor *

JDK所有線程池實(shí)現(xiàn)的父類, 它繼承于AbstractExecutorService抽象類.
ThreadPoolExecutor是JUC線程池的核心實(shí)現(xiàn)類. 線程的創(chuàng)建和終止需要很大的開銷, 線程池中預(yù)先提供了指定數(shù)量的可重用線程, 所以使用線程池會節(jié)省系統(tǒng)資源, 并且每個線程池都維護(hù)了一些基礎(chǔ)的數(shù)據(jù)統(tǒng)計, 方便線程的管理和監(jiān)控.

5. ScheduledExecutorService

ScheduledExecutorService是一個接口, 它繼承于ExecutorService. 它是一個可以完成“延時”和“周期性”任務(wù)的調(diào)度線程池接口, 其功能和Timer/TimerTask類似.
[Timer]Java定時工具類

6. ScheduledThreadPoolExecutor

繼承于ThreadPoolExecutor, 它提供了ScheduledExecutorService線程池接口中"延時執(zhí)行"和"周期執(zhí)行"等抽象調(diào)度方法的具體實(shí)現(xiàn). 類似于Timer, 但是在高并發(fā)程序中, ScheduledThreadPoolExecutor的性能要優(yōu)于Timer.

7. Executors

Executors是一個靜態(tài)工廠類, 它通過靜態(tài)工廠方法返回ExecutorService, ScheduledExecutorService等線程池示例對象, 這些靜態(tài)工廠方法可以理解為一些快捷的創(chuàng)建線程池的方法.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僵控,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鱼冀,更是在濱河造成了極大的恐慌报破,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雷绢,死亡現(xiàn)場離奇詭異泛烙,居然都是意外死亡理卑,警方通過查閱死者的電腦和手機(jī)翘紊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藐唠,“玉大人帆疟,你說我怎么就攤上這事鹉究。” “怎么了踪宠?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵自赔,是天一觀的道長。 經(jīng)常有香客問我柳琢,道長绍妨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任他去,我火速辦了婚禮倒堕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘媳搪。我一直安慰自己秦爆,他們只是感情好涯雅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布活逆。 她就那樣靜靜地躺著,像睡著了一般怒允。 火紅的嫁衣襯著肌膚如雪锈遥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天丽惶,我揣著相機(jī)與錄音钾唬,去河邊找鬼。 笑死奕巍,一個胖子當(dāng)著我的面吹牛儒士,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诅福,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼权谁,長吁一口氣:“原來是場噩夢啊……” “哼憋沿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起采章,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤悯舟,失蹤者是張志新(化名)和其女友劉穎砸民,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體反惕,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姿染,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年悬赏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闽颇。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡兵多,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出中鼠,到底是詐尸還是另有隱情援雇,我是刑警寧澤椎扬,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布蚕涤,位于F島的核電站,受9級特大地震影響揖铜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贿肩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一汰规、第九天 我趴在偏房一處隱蔽的房頂上張望物邑。 院中可真熱鬧,春花似錦茂嗓、人聲如沸科阎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽票唆。三九已至,卻和暖如春衅金,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鉴吹。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工惩琉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞒渠。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓伍玖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親串纺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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