Java 線程池是一種管理和復用線程的機制,其原理如下:
-
核心概念
-
線程池的初始化 :在創建線程池時,需要設置一些關鍵參數,如核心線程數(corePoolSize)、最大線程數(maximumPoolSize)、任務隊列(workQueue)等。
-
核心線程數 :這是線程池中始終保持的線程數量,即使這些線程處于空閑狀態。它們主要用于處理一些基本的任務負載。
-
最大線程數 :當任務數量超過了核心線程數和任務隊列所能承受的范圍時,線程池會創建不超過最大線程數的線程來處理任務。
-
任務隊列 :用于存儲那些已經被提交但尚未被線程處理的任務。常見的任務隊列有直接交義隊列(SynchronousQueue)、有界隊列(如 ArrayBlockingQueue)和無界隊列(如 LinkedBlockingQueue)等。
-
-
工作流程
-
當向線程池提交一個任務時,線程池會首先判斷當前運行的線程數量是否小于核心線程數。如果是,就會創建一個新線程來執行這個任務。
-
如果當前運行的線程數量已經達到核心線程數,那么任務會被放入任務隊列中等待執行。
-
當任務隊列已滿,并且當前運行的線程數量小于最大線程數時,線程池會繼續創建新線程來執行任務。
-
如果任務隊列已滿,并且當前運行的線程數量已經達到最大線程數,那么后續提交的任務會根據拒絕策略(RejectedExecutionHandler)來處理。常見的拒絕策略有AbortPolicy(直接拋出異常)、CallerRunsPolicy(由調用者自己執行任務)、DiscardPolicy(默默丟棄任務)和DiscardOldestPolicy(丟棄任務隊列中最老的任務)等。
-
-
線程的復用與管理
-
線程池中的線程是被復用的。當一個線程完成一個任務后,它不會立即結束,而是回到線程池中等待下一個任務。
-
線程池還可以對線程的生命周期進行管理,例如設置線程的存活時間(keepAliveTime)。空閑線程在這個時間內如果沒有新的任務,就會被銷毀,以避免過多的線程占用系統資源。
-
這種機制可以有效地提高程序的性能和效率,因為它避免了頻繁地創建和銷毀線程所帶來的時間和資源開銷。