91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java線程池的工作原理

發布時間:2021-09-02 15:06:47 來源:億速云 閱讀:189 作者:chen 欄目:編程語言

這篇文章主要講解了“java線程池的工作原理”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java線程池的工作原理”吧!

一、線程池創建

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

java線程池的工作原理

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

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

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

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

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

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

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

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

二、線程池執行流程

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

java線程池的工作原理

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

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

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

java線程池的工作原理

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

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

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

2、再看下addWorker的方法實現

java線程池的工作原理

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

addWorker方法的下半部分:

java線程池的工作原理

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

②啟動啟動這個線程

3、再到Worker里看看其實現

java線程池的工作原理

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

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

java線程池的工作原理

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

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

java線程池的工作原理

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

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

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

感謝各位的閱讀,以上就是“java線程池的工作原理”的內容了,經過本文的學習后,相信大家對java線程池的工作原理這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红河县| 达州市| 呼图壁县| 潜山县| 永定县| 兰西县| 专栏| 南安市| 鄱阳县| 观塘区| 诏安县| 申扎县| 迁安市| 桃源县| 镇雄县| 汤原县| 栖霞市| 怀化市| 布拖县| 尼木县| 中卫市| 沙田区| 商都县| 鹿泉市| 搜索| 静海县| 精河县| 万荣县| 葵青区| 金昌市| 淮安市| 唐海县| 荔浦县| 文成县| 凤翔县| 钟山县| 井陉县| 上栗县| 正宁县| 长子县| 成武县|