ThreadPoolExecutor線程池的一個面試題


問題:現有一個線程池,參數corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞隊列長度為5,此時有4個任務同時進來,問:線程池會創建幾條線程?

如果4個任務還沒處理完,這時又同時進來2個任務,問:線程池又會創建幾條線程還是不會創建?

如果前面6個任務還是沒有處理完,這時又同時進來5個任務,問:線程池又會創建幾條線程還是不會創建?

線程池corePoolSize=5,線程初始化時不會自動創建線程,所以當有4個任務同時進來時,執行execute方法會新建【4】條線程來執行任務;

前面的4個任務都沒完成,現在又進來2個隊列,會新建【1】條線程來執行任務,這時poolSize=corePoolSize,還剩下1個任務,線程池會將剩下這個任務塞進阻塞隊列中,等待空閑線程執行;

如果前面6個任務還是沒有處理完,這時又同時進來了5個任務,此時還沒有空閑線程來執行新來的任務,所以線程池繼續將這5個任務塞進阻塞隊列,但發現阻塞隊列已經滿了,核心線程也用完了,還剩下1個任務不知道如何是好,於是線程池只能創建【1】條“臨時”線程來執行這個任務了;

這里創建的線程用“臨時”來描述還是因為它們不會長期存在於線程池,它們的存活時間為keepAliveTime,此后線程池會維持最少corePoolSize數量的線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM