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

基于線程池的工作原理與源碼解讀

 更新時間:2017年12月31日 10:57:03   作者:metoy  
下面小編就為大家分享一篇基于線程池的工作原理與源碼解讀,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

隨著cpu核數(shù)越來越多,不可避免的利用多線程技術以充分利用其計算能力。所以,多線程技術是服務端開發(fā)人員必須掌握的技術。

線程的創(chuàng)建和銷毀,都涉及到系統(tǒng)調(diào)用,比較消耗系統(tǒng)資源,所以就引入了線程池技術,避免頻繁的線程創(chuàng)建和銷毀。

在Java用有一個Executors工具類,可以為我們創(chuàng)建一個線程池,其本質(zhì)就是new了一個ThreadPoolExecutor對象。線程池幾乎也是面試必考問題。本節(jié)結合源代碼,說說ThreadExecutor的工作原理

一、線程池創(chuàng)建

先看一下ThreadPoolExecutor參數(shù)最全的構造方法:

①corePoolSize:線程池的核心線程數(shù),說白了就是,即便是線程池里沒有任何任務,也會有corePoolSize個線程在候著等任務。

②maximumPoolSize:最大線程數(shù),不管你提交多少任務,線程池里最多工作線程數(shù)就是maximumPoolSize。

③keepAliveTime:線程的存活時間。當線程池里的線程數(shù)大于corePoolSize時,如果等了keepAliveTime時長還沒有任務可執(zhí)行,則線程退出。

⑤unit:這個用來指定keepAliveTime的單位,比如秒:TimeUnit.SECONDS。

⑥workQueue:一個阻塞隊列,提交的任務將會被放到這個隊列里。

⑦threadFactory:線程工廠,用來創(chuàng)建線程,主要是為了給線程起名字,默認工廠的線程名字:pool-1-thread-3。

⑧handler:拒絕策略,當線程池里線程被耗盡,且隊列也滿了的時候會調(diào)用。

以上就是創(chuàng)建線程池時用到的參數(shù),面試中經(jīng)常會有面試官問道這個問題。

二、線程池執(zhí)行流程

這里用一個圖來說明線程池的執(zhí)行流程

任務被提交到線程池,會先判斷當前線程數(shù)量是否小于corePoolSize,如果小于則創(chuàng)建線程來執(zhí)行提交的任務,否則將任務放入workQueue隊列,如果workQueue滿了,則判斷當前線程數(shù)量是否小于maximumPoolSize,如果小于則創(chuàng)建線程執(zhí)行任務,否則就會調(diào)用handler,以表示線程池拒絕接收任務。

這里以jdk1.8.0_111的源代碼為例,看一下具體實現(xiàn)。

1、先看一下線程池的executor方法

①:判斷當前活躍線程數(shù)是否小于corePoolSize,如果小于,則調(diào)用addWorker創(chuàng)建線程執(zhí)行任務

②:如果不小于corePoolSize,則將任務添加到workQueue隊列。

③:如果放入workQueue失敗,則創(chuàng)建線程執(zhí)行任務,如果這時創(chuàng)建線程失敗(當前線程數(shù)不小于maximumPoolSize時),就會調(diào)用reject(內(nèi)部調(diào)用handler)拒絕接受任務。

2、再看下addWorker的方法實現(xiàn)

這塊代碼是在創(chuàng)建非核心線程時,即core等于false。判斷當前線程數(shù)是否大于等于maximumPoolSize,如果大于等于則返回false,即上邊說到的③中創(chuàng)建線程失敗的情況。

addWorker方法的下半部分:

①創(chuàng)建Worker對象,同時也會實例化一個Thread對象。

②啟動啟動這個線程

3、再到Worker里看看其實現(xiàn)

可以看到在創(chuàng)建Worker時會調(diào)用threadFactory來創(chuàng)建一個線程。上邊的②中啟動一個線程就會觸發(fā)Worker的run方法被線程調(diào)用。

4、接下來咱們看看runWorker方法的邏輯

線程調(diào)用runWoker,會while循環(huán)調(diào)用getTask方法從workerQueue里讀取任務,然后執(zhí)行任務。只要getTask方法不返回null,此線程就不會退出。

5、最后在看看getTask方法實現(xiàn)

①咱們先不管allowCoreThreadTimeOut,這個變量默認值是false。wc>corePoolSize則是判斷當前線程數(shù)是否大于corePoolSize。

②如果當前線程數(shù)大于corePoolSize,則會調(diào)用workQueue的poll方法獲取任務,超時時間是keepAliveTime。如果超過keepAliveTime時長,poll返回了null,上邊提到的while循序就會退出,線程也就執(zhí)行完了。

如果當前線程數(shù)小于corePoolSize,則會調(diào)用workQueue的take方法阻塞在當前。

以上這篇基于線程池的工作原理與源碼解讀就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java讀寫Cookie記錄的方法

    Java讀寫Cookie記錄的方法

    這篇文章主要介紹了Java讀寫Cookie記錄的方法,實例分析了java針對cookie記錄讀取與寫入的技巧,需要的朋友可以參考下
    2015-05-05
  • java 面向對象面試集錦

    java 面向對象面試集錦

    這篇文章主要介紹了java 面向對象面試集錦的相關資料,這里整理了面向對象的基礎知識,幫助大家學習理解此部分的知識,需要的朋友可以參考下
    2016-11-11
  • 關于dubbo的超時處理及重試原則

    關于dubbo的超時處理及重試原則

    這篇文章主要介紹了關于dubbo的超時處理及重試原則,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 淺析JDK12的五大重要新特性(推薦)

    淺析JDK12的五大重要新特性(推薦)

    這篇文章主要介紹了JDK12的五大重要新特性,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot實現(xiàn)郵件發(fā)送功能的姿勢分享

    SpringBoot實現(xiàn)郵件發(fā)送功能的姿勢分享

    我們在日常開發(fā)中,經(jīng)常會碰到email郵件發(fā)送的場景,如發(fā)送驗證碼,向客戶發(fā)送郵件等等,這篇文章主要給大家介紹了關于SpringBoot實現(xiàn)郵件發(fā)送的相關資料,需要的朋友可以參考下
    2021-08-08
  • SpringBoot訪問HTML過程詳解

    SpringBoot訪問HTML過程詳解

    這篇文章主要詳細介紹了SpringBoot訪問HTML的全過程,文章中有詳細的代碼和圖片講解,感興趣的同學可以參考一下
    2023-04-04
  • Android入門簡單實例

    Android入門簡單實例

    這篇文章主要介紹了Android入門簡單實例,對于初學Android的朋友有一定的借鑒價值,需要的朋友可以參考下
    2014-08-08
  • 關于swagger配置及踩坑@Api參數(shù)postion無效解決接口排序問題

    關于swagger配置及踩坑@Api參數(shù)postion無效解決接口排序問題

    這篇文章主要介紹了關于swagger配置及踩坑@Api參數(shù)postion無效解決接口排序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java發(fā)送內(nèi)嵌圖片郵件

    java發(fā)送內(nèi)嵌圖片郵件

    這篇文章主要介紹了java發(fā)送內(nèi)嵌圖片郵件,在博客系統(tǒng)中需要郵件服務的功能,僅僅是發(fā)送文本內(nèi)容,現(xiàn)在嘗試一下發(fā)送內(nèi)嵌圖片郵件,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 聊聊Java并發(fā)中的Synchronized

    聊聊Java并發(fā)中的Synchronized

    這篇文章主要介紹了聊聊Java并發(fā)中的Synchronized,介紹了同步的基礎,原理,鎖的相關內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論

富蕴县| 东安县| 鞍山市| 自治县| 汨罗市| 浙江省| 融水| 江油市| 铅山县| 牡丹江市| 壶关县| 东方市| 凌源市| 宾阳县| 正镶白旗| 丹东市| 佛冈县| 中超| 岳西县| 介休市| 龙岩市| 盘山县| 克什克腾旗| 鹤岗市| 乐东| 临潭县| 开鲁县| 彩票| 平塘县| 棋牌| 田东县| 保亭| 甘泉县| 株洲县| 南涧| 阿荣旗| 灵山县| 南部县| 武安市| 安阳市| 彭山县|