最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java concurrency線程池之線程池原理(一)_動力節(jié)點Java學(xué)院整理

 更新時間:2017年06月13日 10:29:15   作者:skywang12345  
這篇文章主要為大家詳細介紹了Java concurrency線程池之線程池原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下

ThreadPoolExecutor簡介

ThreadPoolExecutor是線程池類。對于線程池,可以通俗的將它理解為"存放一定數(shù)量線程的一個線程集合。線程池允許若個線程同時允許,允許同時運行的線程數(shù)量就是線程池的容量;當(dāng)添加的到線程池中的線程超過它的容量時,會有一部分線程阻塞等待。線程池會通過相應(yīng)的調(diào)度策略和拒絕策略,對添加到線程池中的線程進行管理。" 

ThreadPoolExecutor數(shù)據(jù)結(jié)構(gòu)

ThreadPoolExecutor的數(shù)據(jù)結(jié)構(gòu)如下圖所示:

各個數(shù)據(jù)在ThreadPoolExecutor.java中的定義如下:

// 阻塞隊列。
private final BlockingQueue<Runnable> workQueue;
// 互斥鎖
private final ReentrantLock mainLock = new ReentrantLock();
// 線程集合。一個Worker對應(yīng)一個線程。
private final HashSet<Worker> workers = new HashSet<Worker>();
// “終止條件”,與“mainLock”綁定。
private final Condition termination = mainLock.newCondition();
// 線程池中線程數(shù)量曾經(jīng)達到過的最大值。
private int largestPoolSize;
// 已完成任務(wù)數(shù)量
private long completedTaskCount;
// ThreadFactory對象,用于創(chuàng)建線程。
private volatile ThreadFactory threadFactory;
// 拒絕策略的處理句柄。
private volatile RejectedExecutionHandler handler;
// 保持線程存活時間。
private volatile long keepAliveTime;

private volatile boolean allowCoreThreadTimeOut;
// 核心池大小
private volatile int corePoolSize;
// 最大池大小
private volatile int maximumPoolSize;

 

1. workers

    workers是HashSet<Work>類型,即它是一個Worker集合。而一個Worker對應(yīng)一個線程,也就是說線程池通過workers包含了"一個線程集合"。當(dāng)Worker對應(yīng)的線程池啟動時,它會執(zhí)行線程池中的任務(wù);當(dāng)執(zhí)行完一個任務(wù)后,它會從線程池的阻塞隊列中取出一個阻塞的任務(wù)來繼續(xù)運行。
    wokers的作用是,線程池通過它實現(xiàn)了"允許多個線程同時運行"。

2. workQueue

    workQueue是BlockingQueue類型,即它是一個阻塞隊列。當(dāng)線程池中的線程數(shù)超過它的容量的時候,線程會進入阻塞隊列進行阻塞等待。
    通過workQueue,線程池實現(xiàn)了阻塞功能。

3. mainLock

    mainLock是互斥鎖,通過mainLock實現(xiàn)了對線程池的互斥訪問。

4. corePoolSize和maximumPoolSize

    corePoolSize是"核心池大小",maximumPoolSize是"最大池大小"。它們的作用是調(diào)整"線程池中實際運行的線程的數(shù)量"。
    例如,當(dāng)新任務(wù)提交給線程池時(通過execute方法)。
          -- 如果此時,線程池中運行的線程數(shù)量< corePoolSize,則創(chuàng)建新線程來處理請求。
          -- 如果此時,線程池中運行的線程數(shù)量> corePoolSize,但是卻< maximumPoolSize;則僅當(dāng)阻塞隊列滿時才創(chuàng)建新線程。
          如果設(shè)置的 corePoolSize 和 maximumPoolSize 相同,則創(chuàng)建了固定大小的線程池。如果將 maximumPoolSize 設(shè)置為基本的無界值(如 Integer.MAX_VALUE),則允許池適應(yīng)任意數(shù)量的并發(fā)任務(wù)。在大多數(shù)情況下,核心池大小和最大池大小的值是在創(chuàng)建線程池設(shè)置的;但是,也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 進行動態(tài)更改。

5. poolSize

    poolSize是當(dāng)前線程池的實際大小,即線程池中任務(wù)的數(shù)量。

6. allowCoreThreadTimeOut和keepAliveTime

    allowCoreThreadTimeOut表示是否允許"線程在空閑狀態(tài)時,仍然能夠存活";而keepAliveTime是當(dāng)線程池處于空閑狀態(tài)的時候,超過keepAliveTime時間之后,空閑的線程會被終止。

7. threadFactory

    threadFactory是ThreadFactory對象。它是一個線程工廠類,"線程池通過ThreadFactory創(chuàng)建線程"。

8. handler

    handler是RejectedExecutionHandler類型。它是"線程池拒絕策略"的句柄,也就是說"當(dāng)某任務(wù)添加到線程池中,而線程池拒絕該任務(wù)時,線程池會通過handler進行相應(yīng)的處理"。

綜上所說,線程池通過workers來管理"線程集合",每個線程在啟動后,會執(zhí)行線程池中的任務(wù);當(dāng)一個任務(wù)執(zhí)行完后,它會從線程池的阻塞隊列中取出任務(wù)來繼續(xù)運行。阻塞隊列是管理線程池任務(wù)的隊列,當(dāng)添加到線程池中的任務(wù)超過線程池的容量時,該任務(wù)就會進入阻塞隊列進行等待。 

線程池調(diào)度

我們通過下面的圖看看下面線程池中任務(wù)的調(diào)度策略,加深對線程池的理解。

圖-01:

圖-02:

說明:

    在"圖-01"中,線程池中有N個任務(wù)。"任務(wù)1", "任務(wù)2", "任務(wù)3"這3個任務(wù)在執(zhí)行,而"任務(wù)3"到"任務(wù)N"在阻塞隊列中等待。正在執(zhí)行的任務(wù),在workers集合中,workers集合包含3個Worker,每一個Worker對應(yīng)一個Thread線程,Thread線程每次處理一個任務(wù)。
    當(dāng)workers集合中處理完某一個任務(wù)之后,會從阻塞隊列中取出一個任務(wù)來繼續(xù)執(zhí)行,如圖-02所示。圖-02表示"任務(wù)1"處理完畢之后,線程池將"任務(wù)4"從阻塞隊列中取出,放到workers中進行處理。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis Mapper接口工作原理實例解析

    Mybatis Mapper接口工作原理實例解析

    這篇文章主要介紹了Mybatis Mapper接口工作原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Springboot集成mqtt客戶端詳解

    Springboot集成mqtt客戶端詳解

    MQTT是一個基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。MQTT協(xié)議是輕量、簡單、開放和易于實現(xiàn)的,這些特點使它適用范圍非常廣泛。本文為大家分享了Springboot整合mqtt服務(wù)的示例代碼,需要的可以參考一下
    2022-10-10
  • Java中基于maven實現(xiàn)zxing二維碼功能

    Java中基于maven實現(xiàn)zxing二維碼功能

    這篇文章主要介紹了Java中基于maven實現(xiàn)zxing二維碼功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • servlet之web路徑問題_動力節(jié)點Java學(xué)院整理

    servlet之web路徑問題_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了servlet之web路徑問題的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Mybatis plus結(jié)合springboot使用

    Mybatis plus結(jié)合springboot使用

    本文主要介紹了MyBatisPlus使用SpringBoot數(shù)據(jù)庫操作,從添加依賴到測試,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • java使用JDBC動態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法

    java使用JDBC動態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法

    這篇文章主要介紹了java使用JDBC動態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法,涉及JDBC操作數(shù)據(jù)庫的連接、創(chuàng)建表、添加數(shù)據(jù)、查詢等相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • 如何解決java壓縮文件亂碼問題

    如何解決java壓縮文件亂碼問題

    在本篇文章中我們給大家分享的是一篇關(guān)于java壓縮文件亂碼問題的解決辦法,有需要的朋友們可以學(xué)習(xí)下。
    2019-12-12
  • SpringBoot異步實現(xiàn) 的8種方式

    SpringBoot異步實現(xiàn) 的8種方式

    在同步操作中,執(zhí)行到?發(fā)送短信?的時候,我們必須等待這個方法徹底執(zhí)行完才能執(zhí)行?贈送積分?這個操作,如果?贈送積分?這個動作執(zhí)行時間較長,發(fā)送短信需要等待,這就是典型的同步場景,這篇文章主要介紹了SpringBoot異步實現(xiàn) 的8種方式,需要的朋友可以參考下
    2023-11-11
  • Mybatis-Plus環(huán)境配置與入門案例分析

    Mybatis-Plus環(huán)境配置與入門案例分析

    MyBatis-Plus 是一個 Mybatis 增強版工具,在 MyBatis 上擴充了其他功能沒有改變其基本功能,為了簡化開發(fā)提交效率而存在,本篇文章帶你配置環(huán)境并認(rèn)識它
    2022-03-03
  • 使用mybatis log plugin插件展示出數(shù)據(jù)庫查詢語句方式

    使用mybatis log plugin插件展示出數(shù)據(jù)庫查詢語句方式

    本文介紹了如何安裝和配置MyBatis日志插件,包括集成log4j、配置log4j.xml文件和在application.properties中添加數(shù)據(jù)庫打印配置,通過這些步驟,可以在調(diào)試時查看預(yù)編譯的數(shù)據(jù)庫語句和實際查詢語句
    2024-11-11

最新評論

兴国县| 徐州市| 洪湖市| 兴城市| 长春市| 黑山县| 苏州市| 扬州市| 泰兴市| 晋中市| 东山县| 当雄县| 尖扎县| 枣阳市| 新邵县| 左贡县| 开江县| 冕宁县| 岳阳市| 惠州市| 永定县| 东安县| 龙井市| 灵山县| 平遥县| 织金县| 潜江市| 保德县| 曲水县| 邵阳县| 乌拉特后旗| 含山县| 湾仔区| 清远市| 吉木乃县| 延津县| 比如县| 宁乡县| 吉木萨尔县| 乐山市| 托克托县|