線程池是 Java 中用于提升程序執行效率的主要手段,也是并發編程中的核心實現技術,并且它也被廣泛的應用在日常項目的開發之中。那問題來了,如果把線程池中的核心線程數設置為 0 時,線程池是如何執行的?
要回答這個問題,我們首先要了解在正常情況下,線程池的執行流程,也就是說當有一個任務來了之后,線程池是如何運行的?
正常情況下(核心線程數不為 0 的情況下)線程池的執行流程如下:
如下圖所示:
圖片
核心線程數(corePoolSize)和最大線程數(maximumPoolSize)都是線程池中的兩個重要參數,其中:
PS:在線程池的使用過程中,最大線程數必須大于等于核心線程數,否則程序執行會報錯。
那么問題來了,按照線程池的正常執行流程來看,如果核心線程數為 0 的話,那么當任務來了之后會判斷當前工作的線程數不大于核心線程數,那也就不會創建線程執行任務了,會將任務放到隊列。
但這個結果又很滑稽,有任務來了線程池竟然不執行,而是先放到任務隊列中,這好像有比較奇怪,這就好比你開了一個快遞店,當有快遞來了之后,你想的不是如何派送,而是直接把它丟到倉庫一樣滑稽,這會讓等快遞的人很著急,所以,我們需要驗證一下線程池的執行是否如我們猜想的那般,驗證代碼如下:
// 線程池核心線程數設置為 0ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 0, 10, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));// 給線程池添加任務threadPoolExecutor.execute(() -> { System.out.println("www.javacn.site");});
最終程序的執行結果如下:
圖片
咦,結果怎么不符合我們的預期呢?為什么任務來了之后,沒有將任務放到任務隊列而是直接執行了呢?
雖然程序執行結果符合正常邏輯,但又和我們了解的線程池執行理論相違背,這是什么原因呢?
帶著這個疑問,我們查看了線程池的執行源碼發現,線程池的執行過程遠比我們想想的復雜,線程池核心源碼如下:
圖片
從上面源碼可以看出,當我們將任務添加到隊列的時候,線程池會判斷工作的線程數是否為 0,也就是上面圈出來的那行代碼,如果當前工作線程為 0 的話,會創建線程執行任務。哦,原來如此,這樣,就能將理論和實踐對應上了。
也就是說,當核心線程數為 0 時,當來了一個任務之后,會先將任務添加到任務隊列,同時也會判斷當前工作的線程數是否為 0,如果為 0,則會創建線程來執行線程池的任務,這就是正確的線程池執行流程,同時也是面試官想要的答案。
本文鏈接:http://www.www897cc.com/showinfo-26-87259-0.html美團面試官:核心線程數為0時,線程池如何執行?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
下一篇: 虛擬現實與增強現實:數字轉型的下一個前沿