<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:說一下線程池內(nèi)部工作原理?

          共 2134字,需瀏覽 5分鐘

           ·

          2021-06-16 10:11

          點擊上方“碼農(nóng)突圍”,馬上關(guān)注

          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包

          真愛,請設(shè)置“星標(biāo)”或點個“在看

          作者:清泉

          cnblogs.com/qingquanzi/p/8146638.html

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

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

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

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

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


          圖片


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

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

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

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

          • workQueue: 一個阻塞隊列,提交的任務(wù)將會被放到這個隊列里。

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

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

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

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

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


          圖片


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

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

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


          圖片


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

          • 如果不小于corePoolSize,則將任務(wù)添加到workQueue隊列。

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

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

          這塊代碼是在創(chuàng)建非核心線程時,即core等于false。判斷當(dāng)前線程數(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里讀取任務(wù),然后執(zhí)行任務(wù)。只要getTask方法不返回null,此線程就不會退出。

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


          圖片


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

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

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

          - END -

          最近熱文

          ?  985研究生組團(tuán)詐騙,一個中招就關(guān)App,涉案金額超1億,受害人遍布全國
          ?  請立即卸載這款 IDEA 插件
          ?  開掛的 00 后!17 歲“天才少女”被 8 所世界名校錄取,最終選擇 MIT 計算機(jī)系
          ?  再見,Eclipse。

          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  伊人在线免费视频 | 免费人人操 | 日本无码北条麻妃 | 国产综合内射日韩久 | 国产人妻人伦精品1国产 |