激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 99re色| 8x成人在线电影 | 日韩av一区三区 | 久久国产成人午夜av浪潮 | 成人电影毛片 | 久久免费视频一区二区三区 | 成人午夜视屏 | 水卜樱一区二区av | 欧美a v在线 | 中文字幕在线永久视频 | 中国av一级片 | 日日操视频| xxxxhdvideosex | 国产亚洲精品久久久久久久久 | 特级无码毛片免费视频尤物 | 日本人乱人乱亲乱色视频观看 | 免费毛片电影 | v11av在线播放 | 亚洲片在线 | 91专区在线观看 | 97久色| 国产一区二区三区四区五区在线 | 亚洲第一成人在线视频 | 在线播放污 | 国产精品久久久久久久hd | 99re久久最新地址获取 | 亚洲一区播放 | 亚洲第一视频 | 国产精品久久久久久久久久妇女 | 日日做 | 国产一级一国产一级毛片 | 国产精品毛片无码 | a黄毛片| 亚洲精品久久久久久 | 色视频欧美 | 亚洲国产超高清a毛毛片 | 久草在线最新 | 成人在线视频免费 | 懂色粉嫩av久婷啪 | 国内精品久久久久久久久久久久 | 欧美精品一区二区三区四区 |