日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

美團面試官:核心線程數為0時,線程池如何執行?

來源: 責編: 時間:2024-05-08 09:19:40 164觀看
導讀線程池是 Java 中用于提升程序執行效率的主要手段,也是并發編程中的核心實現技術,并且它也被廣泛的應用在日常項目的開發之中。那問題來了,如果把線程池中的核心線程數設置為 0 時,線程池是如何執行的?要回答這個問題,我們

線程池是 Java 中用于提升程序執行效率的主要手段,也是并發編程中的核心實現技術,并且它也被廣泛的應用在日常項目的開發之中。那問題來了,如果把線程池中的核心線程數設置為 0 時,線程池是如何執行的?9fW28資訊網——每日最新資訊28at.com

要回答這個問題,我們首先要了解在正常情況下,線程池的執行流程,也就是說當有一個任務來了之后,線程池是如何運行的?9fW28資訊網——每日最新資訊28at.com

1.線程池的執行流程

正常情況下(核心線程數不為 0 的情況下)線程池的執行流程如下:9fW28資訊網——每日最新資訊28at.com

  1. 判斷核心線程數:先判斷當前工作線程數是否大于核心線程數,如果結果為 false,則新建線程并執行任務。
  2. 判斷任務隊列:如果大于核心線程數,則判斷任務隊列是否已滿?如果結果為 false,則把任務添加到任務隊列中等待線程執行。
  3. 判斷最大線程數:如果任務隊列已滿,則判斷當前線程數量是否超過最大線程數?如果結果為 false,則新建線程執行此任務。
  4. 判斷是否要執行拒絕策略:如果超過最大線程數,則將執行線程池的拒絕策略。

如下圖所示:9fW28資訊網——每日最新資訊28at.com

圖片圖片9fW28資訊網——每日最新資訊28at.com

核心線程數 VS 最大線程數

核心線程數(corePoolSize)和最大線程數(maximumPoolSize)都是線程池中的兩個重要參數,其中:9fW28資訊網——每日最新資訊28at.com

  1. 核心線程數定義了線程池中最小線程數量,即使這些線程處于空閑狀態,也不會被銷毀。
  2. 最大線程數定義了線程池中允許的最大線程數量,最大線程數等于核心線程數 + 臨時線程數,最大線程數主要是提供了一種機制來應對突發的高并發請求,當有大量任務的時候,可以創建線程數量的上線。

PS:在線程池的使用過程中,最大線程數必須大于等于核心線程數,否則程序執行會報錯。9fW28資訊網——每日最新資訊28at.com

2.核心線程為0的執行流程

那么問題來了,按照線程池的正常執行流程來看,如果核心線程數為 0 的話,那么當任務來了之后會判斷當前工作的線程數不大于核心線程數,那也就不會創建線程執行任務了,會將任務放到隊列。9fW28資訊網——每日最新資訊28at.com

但這個結果又很滑稽,有任務來了線程池竟然不執行,而是先放到任務隊列中,這好像有比較奇怪,這就好比你開了一個快遞店,當有快遞來了之后,你想的不是如何派送,而是直接把它丟到倉庫一樣滑稽,這會讓等快遞的人很著急,所以,我們需要驗證一下線程池的執行是否如我們猜想的那般,驗證代碼如下:9fW28資訊網——每日最新資訊28at.com

// 線程池核心線程數設置為 0ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(                0, 10, 1, TimeUnit.SECONDS,                new ArrayBlockingQueue<>(10));// 給線程池添加任務threadPoolExecutor.execute(() -> {    System.out.println("www.javacn.site");});

最終程序的執行結果如下:9fW28資訊網——每日最新資訊28at.com

圖片圖片9fW28資訊網——每日最新資訊28at.com

咦,結果怎么不符合我們的預期呢?為什么任務來了之后,沒有將任務放到任務隊列而是直接執行了呢?9fW28資訊網——每日最新資訊28at.com

雖然程序執行結果符合正常邏輯,但又和我們了解的線程池執行理論相違背,這是什么原因呢?9fW28資訊網——每日最新資訊28at.com

查看線程池的執行源碼

帶著這個疑問,我們查看了線程池的執行源碼發現,線程池的執行過程遠比我們想想的復雜,線程池核心源碼如下:9fW28資訊網——每日最新資訊28at.com

圖片圖片9fW28資訊網——每日最新資訊28at.com

從上面源碼可以看出,當我們將任務添加到隊列的時候,線程池會判斷工作的線程數是否為 0,也就是上面圈出來的那行代碼,如果當前工作線程為 0 的話,會創建線程執行任務。哦,原來如此,這樣,就能將理論和實踐對應上了。9fW28資訊網——每日最新資訊28at.com

也就是說,當核心線程數為 0 時,當來了一個任務之后,會先將任務添加到任務隊列,同時也會判斷當前工作的線程數是否為 0,如果為 0,則會創建線程來執行線程池的任務,這就是正確的線程池執行流程,同時也是面試官想要的答案。9fW28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87259-0.html美團面試官:核心線程數為0時,線程池如何執行?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 十項快速檢查,確保你的 AWS 支出處于控制之中

下一篇: 虛擬現實與增強現實:數字轉型的下一個前沿

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 教育| 泾川县| 南靖县| 榆社县| 象州县| 田东县| 盐边县| 九江县| 敦化市| 保定市| 个旧市| 宁国市| 瑞丽市| 上犹县| 鄂托克前旗| 文登市| 镇坪县| 柳河县| 浏阳市| 荔波县| 霸州市| 漳州市| 常熟市| 垦利县| 陈巴尔虎旗| 鲁甸县| 贺兰县| 保亭| 北京市| 和平区| 甘德县| 永平县| 南雄市| 邳州市| 双辽市| 临高县| 青岛市| 璧山县| 章丘市| 彝良县| 大兴区|