一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 基于線程池的工作原理與源碼解讀

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

2021-03-13 14:19metoy Java教程

下面小編就為大家分享一篇基于線程池的工作原理與源碼解讀,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

在java用有一個executors工具類,可以為我們創建一個線程池,其本質就是new了一個threadpoolexecutor對象。線程池幾乎也是面試必考問題。本節結合源代碼,說說threadexecutor的工作原理

一、線程池創建

先看一下threadpoolexecutor參數最全的構造方法:

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

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

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

③keepalivetime:線程的存活時間。當線程池里的線程數大于corepoolsize時,如果等了keepalivetime時長還沒有任務可執行,則線程退出。

⑤unit:這個用來指定keepalivetime的單位,比如秒:timeunit.seconds。

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

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

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

以上就是創建線程池時用到的參數,面試中經常會有面試官問道這個問題。

二、線程池執行流程

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

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

任務被提交到線程池,會先判斷當前線程數量是否小于corepoolsize,如果小于則創建線程來執行提交的任務,否則將任務放入workqueue隊列,如果workqueue滿了,則判斷當前線程數量是否小于maximumpoolsize,如果小于則創建線程執行任務,否則就會調用handler,以表示線程池拒絕接收任務。

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

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

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

①:判斷當前活躍線程數是否小于corepoolsize,如果小于,則調用addworker創建線程執行任務

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

③:如果放入workqueue失敗,則創建線程執行任務,如果這時創建線程失敗(當前線程數不小于maximumpoolsize時),就會調用reject(內部調用handler)拒絕接受任務。

2、再看下addworker的方法實現

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

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

addworker方法的下半部分:

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

①創建worker對象,同時也會實例化一個thread對象。

②啟動啟動這個線程

3、再到worker里看看其實現

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

可以看到在創建worker時會調用threadfactory來創建一個線程。上邊的②中啟動一個線程就會觸發worker的run方法被線程調用。

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

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

線程調用runwoker,會while循環調用gettask方法從workerqueue里讀取任務,然后執行任務。只要gettask方法不返回null,此線程就不會退出。

5、最后在看看gettask方法實現

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

①咱們先不管allowcorethreadtimeout,這個變量默認值是false。wc>corepoolsize則是判斷當前線程數是否大于corepoolsize。

②如果當前線程數大于corepoolsize,則會調用workqueue的poll方法獲取任務,超時時間是keepalivetime。如果超過keepalivetime時長,poll返回了null,上邊提到的while循序就會退出,線程也就執行完了。

如果當前線程數小于corepoolsize,則會調用workqueue的take方法阻塞在當前。

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

原文鏈接:https://www.cnblogs.com/qingquanzi/p/8146638.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲欧美日韩中文高清一 | 72张让男人一看就硬的图片 | 久久久久久免费观看 | 日本精品中文字幕在线播放 | 国产特级 | 被肉日常np高h | 91高清国产经典在线观看 | 交换年轻夫妇HD中文字幕 | 日韩欧美一区二区三区视频 | 91亚洲精品国产自在现线 | 扒开尿口 | 国产精品嫩草影院一二三区 | 欧美人妖大啪啪 | 国产美女极品免费视频 | 唯美清纯 自拍偷 | 亚洲第一天堂无码专区 | 肉性天堂 | 亚洲视频在线观看免费视频 | 九九精品免费视频 | 2022天天干 | 国产精品日韩欧美一区二区三区 | 精品午夜寂寞影院在线观看 | 摸进老太婆的裤裆小说 | 亚洲精品综合网 | 日本免费久久久久久久网站 | 精品日产1区2卡三卡麻豆 | 亚洲AV久久无码精品蜜桃 | 国产成人精品本亚洲 | 成人夜视频寂寞在线观看 | 羞羞一区二区三区四区片 | ffyybb免费福利视频 | 美女扒开胸罩露出奶了无遮挡免费 | 亚洲区视频在线观看 | 亚洲大逼| 俺去俺来也在线www色官网 | 国产综合视频 | 欧美一级在线视频 | 国产第一综合另类色区奇米 | 人人做人人爽人人爱 | 亚州男人天堂 | 特级老女人淫片高清视频 |