国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java線程池框架核心代碼分析

開發(fā) 后端
多線程編程中,為每個任務分配一個線程是不現(xiàn)實的,線程創(chuàng)建的開銷和資源消耗都是很高的。線程池應運而生,成為我們管理線程的利器。Java 通過Executor接口,提供了一種標準的方法將任務的提交過程和執(zhí)行過程解耦開來,并用Runnable表示任務。

前言

多線程編程中,為每個任務分配一個線程是不現(xiàn)實的,線程創(chuàng)建的開銷和資源消耗都是很高的。線程池應運而生,成為我們管理線程的利器。Java 通過Executor接口,提供了一種標準的方法將任務的提交過程和執(zhí)行過程解耦開來,并用Runnable表示任務。

下面,我們來分析一下 Java 線程池框架的實現(xiàn)ThreadPoolExecutor

下面的分析基于JDK1.7

生命周期

ThreadPoolExecutor中,使用CAPACITY的高3位來表示運行狀態(tài),分別是:

  1. RUNNING:接收新任務,并且處理任務隊列中的任務
  2. SHUTDOWN:不接收新任務,但是處理任務隊列的任務
  3. STOP:不接收新任務,不出來任務隊列,同時中斷所有進行中的任務
  4. TIDYING:所有任務已經(jīng)被終止,工作線程數(shù)量為 0,到達該狀態(tài)會執(zhí)行terminated()
  5. TERMINATED:terminated()執(zhí)行完畢

狀態(tài)轉(zhuǎn)換圖

狀態(tài)轉(zhuǎn)換圖

ThreadPoolExecutor中用原子類來表示狀態(tài)位

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

線程池模型

核心參數(shù)

  • corePoolSize:最小存活的工作線程數(shù)量(如果設(shè)置allowCoreThreadTimeOut,那么該值為 0)
  • maximumPoolSize:最大的線程數(shù)量,受限于CAPACITY
  • keepAliveTime:對應線程的存活時間,時間單位由TimeUnit指定
  • workQueue:工作隊列,存儲待執(zhí)行的任務
  • RejectExecutionHandler:拒絕策略,線程池滿后會觸發(fā)

線程池的最大容量CAPACITY中的前三位用作標志位,也就是說工作線程的最大容量為(2^29)-1

四種模型

  • CachedThreadPool:一個可緩存的線程池,如果線程池的當前規(guī)模超過了處理需求時,那么將回收空閑的線程,當需求增加時,則可以添加新的線程,線程池的規(guī)模不存在任何的限制。
  • FixedThreadPool:一個固定大小的線程池,提交一個任務時就創(chuàng)建一個線程,直到達到線程池的最大數(shù)量,這時線程池的大小將不再變化。
  • SingleThreadPool:一個單線程的線程池,它只有一個工作線程來執(zhí)行任務,可以確保按照任務在隊列中的順序來串行執(zhí)行,如果這個線程異常結(jié)束將創(chuàng)建一個新的線程來執(zhí)行任務。
  • ScheduledThreadPool:一個固定大小的線程池,并且以延遲或者定時的方式來執(zhí)行任務,類似于Timer。

執(zhí)行任務 execute

核心邏輯:

  1. 當前線程數(shù)量 < corePoolSize,直接開啟新的核心線程執(zhí)行任務addWorker(command, true)
  2. 當前線程數(shù)量 >= corePoolSize,且任務加入工作隊列成功
    1. 檢查線程池當前狀態(tài)是否處于RUNNING
    2. 如果否,則拒絕該任務
    3. 如果是,判斷當前線程數(shù)量是否為 0,如果為 0,就增加一個工作線程。
  3. 開啟普通線程執(zhí)行任務addWorker(command, false),開啟失敗就拒絕該任務

從上面的分析可以總結(jié)出線程池運行的四個階段:

  1. poolSize < corePoolSize 且隊列為空,此時會新建線程來處理提交的任務
  2. poolSize == corePoolSize,此時提交的任務進入工作隊列,工作線程從隊列中獲取任務執(zhí)行,此時隊列不為空且未滿。
  3. poolSize == corePoolSize,并且隊列已滿,此時也會新建線程來處理提交的任務,但是poolSize < maxPoolSize
  4. poolSize == maxPoolSize,并且隊列已滿,此時會觸發(fā)拒絕策略

拒絕策略

前面我們提到任務無法執(zhí)行會被拒絕,RejectedExecutionHandler是處理被拒絕任務的接口。下面是四種拒絕策略。

  • AbortPolicy:默認策略,終止任務,拋出RejectedException
  • CallerRunsPolicy:在調(diào)用者線程執(zhí)行當前任務,不拋異常
  • DiscardPolicy: 拋棄策略,直接丟棄任務,不拋異常
  • DiscardOldersPolicy:拋棄最老的任務,執(zhí)行當前任務,不拋異常

線程池中的 Worker

Worker繼承了AbstractQueuedSynchronizerRunnable,前者給Worker提供鎖的功能,后者執(zhí)行工作線程的主要方法runWorker(Worker w)(從任務隊列撈任務執(zhí)行)。Worker 引用存在workers集合里面,用mainLock守護。

private final ReentrantLock mainLock = new ReentrantLock();
private final HashSet<Worker> workers = new HashSet<Worker>();

核心函數(shù) runWorker

下面是簡化的邏輯,注意:每個工作線程的run都執(zhí)行下面的函數(shù)

final void runWorker(Worker w) {
    Thread wt = Thread.currentThread();
    Runnable task = w.firstTask;
    w.firstTask = null;
    while (task != null || (task = getTask()) != null) {
        w.lock();
        beforeExecute(wt, task);
        task.run();
        afterExecute(task, thrown);
        w.unlock();
    }
    processWorkerExit(w, completedAbruptly);
}
  1. getTask()中獲取任務
  2. 鎖住 worker
  3. 執(zhí)行beforeExecute(wt, task),這是ThreadPoolExecutor提供給子類的擴展方法
  4. 運行任務,如果該worker有配置了首次任務,則先執(zhí)行首次任務且只執(zhí)行一次。
  5. 執(zhí)行afterExecute(task, thrown);
  6. 解鎖 worker
  7. 如果獲取到的任務為 null,關(guān)閉 worker

獲取任務 getTask

線程池內(nèi)部的任務隊列是一個阻塞隊列,具體實現(xiàn)在構(gòu)造時傳入。

private final BlockingQueue<Runnable> workQueue;

getTask()從任務隊列中獲取任務,支持阻塞和超時等待任務,四種情況會導致返回null,讓worker關(guān)閉。

  1. 現(xiàn)有的線程數(shù)量超過最大線程數(shù)量
  2. 線程池處于STOP狀態(tài)
  3. 線程池處于SHUTDOWN狀態(tài)且工作隊列為空
  4. 線程等待任務超時,且線程數(shù)量超過保留線程數(shù)量

核心邏輯:根據(jù)timed在阻塞隊列上超時等待或者阻塞等待任務,等待任務超時會導致工作線程被關(guān)閉。

timed = allowCoreThreadTimeOut || wc > corePoolSize;
Runnable r = timed ?
    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
    workQueue.take();

在以下兩種情況下等待任務會超時:

  1. 允許核心線程等待超時,即allowCoreThreadTimeOut(true)
  2. 當前線程是普通線程,此時wc > corePoolSize

工作隊列使用的是BlockingQueue,這里就不展開了,后面再寫一篇詳細的分析。

總結(jié)

  • ThreadPoolExecutor基于生產(chǎn)者-消費者模式,提交任務的操作相當于生產(chǎn)者,執(zhí)行任務的線程相當于消費者。
  • Executors提供了四種基于ThreadPoolExecutor構(gòu)造線程池模型的方法,除此之外,我們還可以直接繼承ThreadPoolExecutor,重寫beforeExecuteafterExecute方法來定制線程池任務執(zhí)行過程。
  • 使用有界隊列還是無界隊列需要根據(jù)具體情況考慮,工作隊列的大小和線程的數(shù)量也是需要好好考慮的。
  • 拒絕策略推薦使用CallerRunsPolicy,該策略不會拋棄任務,也不會拋出異常,而是將任務回退到調(diào)用者線程中執(zhí)行。
責任編輯:張燕妮 來源: Yonah-瀟
相關(guān)推薦

2022-11-09 09:01:08

并發(fā)編程線程池

2013-05-28 13:57:12

MariaDB

2023-11-29 16:38:12

線程池阻塞隊列開發(fā)

2018-10-31 15:54:47

Java線程池源碼

2010-03-18 16:19:02

Java自定義線程池

2012-05-15 02:18:31

Java線程池

2012-02-29 13:26:20

Java

2020-09-04 10:29:47

Java線程池并發(fā)

2025-02-28 08:46:24

框架微服務架構(gòu)

2024-05-08 00:00:00

核心線程數(shù)隊列

2015-08-20 09:17:36

Java線程池

2020-11-25 11:33:47

Java線程技術(shù)

2012-02-01 11:20:23

Java線程

2023-05-19 08:01:24

Key消費場景

2023-09-19 14:59:47

線程開發(fā)

2021-06-06 23:40:53

線程池使用場景

2023-11-22 08:37:40

Java線程池

2013-05-23 15:59:00

線程池

2021-09-11 15:26:23

Java多線程線程池

2013-06-08 13:07:23

Java線程池調(diào)度器
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品qvod| 91精品国产综合久久久久久豆腐| 91精品国产综合久久久久久丝袜| 在线欧美成人| 九九久久成人| 亚洲资源中文字幕| 成人毛片高清视频观看| 日韩h在线观看| 免费精品视频一区二区三区| 国产免费拔擦拔擦8x高清在线人 | 久久久精品区| 8848成人影院| 国产一区二区三区欧美| 三级外国片在线观看视频| 久久久久一区二区三区| 高清av一区| 亚洲免费视频观看| 日本www在线观看| 女厕嘘嘘一区二区在线播放 | 亚洲成人免费网站| 日本激情视频在线播放| 91看片淫黄大片一级在线观看| 日本在线成人一区二区| 视频精品一区二区| 成人在线视频网址| 一区二区三区短视频| 亚洲嫩模很污视频| 欧美大片高清| 欧美日韩国产一区在线| 成人禁在线观看网站| 日本一区二区三区dvd视频在线| 永久www成人看片| 精品88久久久久88久久久| 久久久9色精品国产一区二区三区| 不卡的av一区| 日本午夜一区二区| 国产成人一区二区三区免费看| 精品欧美午夜寂寞影院| 欧美在线一级视频| 7777精品视频| 久久中文精品| 日韩美女爱爱视频| 国产精品久久久久久麻豆一区软件| 国产精品久久精品国产| 亚州av一区| www.欧美精品一二三区| 国产精品美女主播| 国产精品av免费| 99久久九九| 97人人爽人人喊人人模波多| 四季av一区二区凹凸精品| 中文字幕日本精品| 亚洲爽爆av| 日韩电影在线观看中文字幕| 人成在线免费视频| 国产精品一区2区| 丝袜美腿亚洲一区二区| 国产婷婷一区二区| 色婷婷综合久久久| 亚洲成人天堂| 亚洲成人精品综合在线| 国产精品高潮视频| 亚洲校园欧美国产另类| 亚洲私人黄色宅男| 亚洲最大黄色| 在线午夜精品自拍| 久久久久av| 国产91在线亚洲| 性久久久久久久久久久久| 涩涩在线视频| 91九色国产在线| 亚洲成人资源| 91美女高潮出水| 国产精品一二三区在线| 久久美女艺术照精彩视频福利播放| 欧美一区激情视频在线观看| 韩国成人动漫在线观看| 久久精品午夜| 手机在线免费观看毛片| 精品不卡在线视频| 国内精品久久久久久99蜜桃| 东北少妇不带套对白| 国产成人精选| 激情久久久久久久| 精品亚洲国产视频| 在线观看的网站你懂的| 精品视频色一区| 成人高清免费在线| 在线观看精品国产视频| 国产一区二区三区四区五区3d| 日韩三级av在线播放| 伊人国产在线看一| 久久久五月婷婷| 97在线日本国产| 国产精品第十页| 国模吧无码一区二区三区| 久久99久久久欧美国产| 日韩欧美在线番号| 91精品视频在线播放| 日韩欧美一区免费| 成人啪啪免费看| 欧美人伦禁忌dvd放荡欲情| 国产情侣久久| 国产剧情av在线播放| 国产+成+人+亚洲欧洲| 亚洲国产精品久久不卡毛片| 永久91嫩草亚洲精品人人| 成人在线免费看| 日本精品视频一区| 五月综合激情婷婷六月色窝| 丁香花视频在线观看| 欧美一进一出视频| xxxx欧美18另类的高清| 久久久久国产精品厨房| 成人羞羞网站| 678在线观看视频| 亚洲欧美日韩不卡| 精品国产一二三| 国产精品一二| 久草在线官网| 久久精品视频一| 麻豆蜜桃在线| 国产免费色视频| 亚洲香蕉成人av网站在线观看| 亚洲综合丁香| 原纱央莉成人av片| 亚洲黄色网址在线观看| 日韩电影视频免费| 国产v综合v亚洲欧| bl在线肉h视频大尺度| 亚洲国产欧美一区二区三区久久| 日本vs亚洲vs韩国一区三区| 国产第一页在线视频| 久久久久久人妻一区二区三区| 久久天天躁狠狠躁夜夜av| 日本一区二区三区国色天香| 香蕉大人久久国产成人av| 成年丰满熟妇午夜免费视频| 91在线精品秘密一区二区| 一区高清视频| 日韩美女一区二区三区| 亚洲视频免费观看| 91免费在线播放| 国产一区二区三区免费看 | 99精品综合| 日本调教视频在线观看| 欧美日韩亚洲精品内裤| 日韩精品1区| 国产一级二级三级在线观看| 精品视频在线观看| 欧美日韩高清一区二区不卡| 玖玖玖视频精品| 国产精品欧美激情在线观看| 日本欧美中文字幕| 欧美视频在线不卡| av在线一区不卡| 校园春色 亚洲色图| 成人黄色av网| 日韩精品免费一线在线观看| 免费观看在线色综合| 一卡二卡三卡亚洲| 欧美自拍视频在线| 久草在线在线精品观看| 日韩国产高清一区| 亚洲精品在线观看www| 久久精品九九| 天使と恶魔の榨精在线播放| 国产成+人+综合+亚洲欧美丁香花| 精品国产91久久久久久老师| 精品伊人久久久| 少妇久久久久久被弄到高潮| 欧美一级日韩免费不卡| 99精品视频免费观看视频| 91精品国产高久久久久久五月天| 国产麻豆精品在线观看| 色网在线观看| 亚洲精品国产精品国自产| 亚洲精品在线三区| 日本在线观看不卡视频| 激情开心成人网| 菠萝蜜视频在线观看入口| 7777精品久久久大香线蕉| 色综合蜜月久久综合网| 国产v亚洲v天堂无码| 亚洲色图视频网站| 任你弄精品视频免费观看| 国产精品拍拍拍| 国产成人一区二| 欧美另类变人与禽xxxxx| 一呦二呦三呦国产精品| 五月亚洲婷婷| 成人豆花视频| 欧美jizz18性欧美| 国产精品视频26uuu| 九九视频这里只有精品 | 校园春色 亚洲色图| 一本一道久久久a久久久精品91| 精品综合在线| 国产区一区二区| 国产久一道中文一区|