Java 線程池詳解
時間:2024-02-20 來源:華清遠見
1 什么是線程
線程(Thread)是計算機中的一條執行路徑,它是進程中的一個實體,負責程序中的指令執行。在一個進程中可以包含多個線程,每個線程可以并行執行不同的任務,從而加快程序的運行速度。
線程獨立于進程而存在,但是它們都處于操作系統所分配的資源上下文中。線程需要依賴于進程來獲得運行資源,如內存、CPU 時間等。在多線程編程中,線程可以共享進程的資源,因此線程之間可以更加高效地完成任務。
使用線程可以提高程序的響應速度和并發性,特別是在多核 CPU 的環境下,可以充分利用 CPU 資源,提高程序的運行效率。但是多線程編程也存在一些問題,比如線程安全、死鎖等,需要開發者注意和處理
2 什么是線程池
線程池(Thread Pool)是一種用于管理和調度線程的機制。它是在應用程序啟動時創建一組預先初始化的線程,并將這些線程放入一個池中,供需要執行任務的代碼使用。
線程池的主要目的是重用線程,避免頻繁創建和銷毀線程的開銷,提高程序的性能和資源利用率。當有新的任務到達時,線程池從池中取出一個空閑的線程來執行任務,執行完畢后線程并不立即銷毀,而是返回線程池等待下一次任務的到來。
3 線程池的作用
線程池主要有兩個作用:
● 重復利用已經創建的線程,避免創建和銷毀線程的開銷;
● 控制并發線程的數量,避免過多的線程占用系統資源。
4 線程池的實現方式
Java 線程池可以通過 ThreadPoolExecutor 類來實現,該類提供了一系列的構造方法,可以根據不同的需求來創建線程池。常用的構造方法如下:
其中,參數解釋如下:
● corePoolSize:核心線程數,即線程池中最少需要保持的線程數量;
● maximumPoolSize:最大線程數,即線程池中允許存在的最多線程數量;
● keepAliveTime:線程空閑時間,即當線程空閑時間超過該值,且當前線程數量超過 corePoolSize,則該線程會被銷毀;
● unit:空閑時間的單位;
● workQueue:工作隊列,用于存放等待執行的任務。
5線程池的工作流程
線程池的工作流程如下:
1) 當任務到來時,線程池會先判斷當前線程池中的線程數量是否達到了 corePoolSize,如果沒有,則創建一個新的線程執行該任務。
2) 如果當前線程池中的線程數量已經達到了 corePoolSize,則將任務加入到工作隊列中等待執行。
3) 當工作隊列已滿時,線程池會繼續創建新的線程執行任務,直到線程數量達到了 maximumPoolSize。
4) 如果線程數量已經達到了 maximumPoolSize,且工作隊列已經滿了,則線程池會根據設置的拒絕策略進行處理,一般情況下會拋出異常。
6 線程池的拒絕策略
ThreadPoolExecutor 類提供了四種拒絕策略:
1) AbortPolicy:默認策略,當任務無法被處理時,會拋出 RejectedExecutionException 異常;
2) CallerRunsPolicy:當任務無法被處理時,會在提交任務的線程上直接執行該任務;
3) DiscardOldestPolicy:當任務無法被處理時,會丟棄等待隊列中最舊的任務,并嘗試重新提交該任務;
4) DiscardPolicy:當任務無法被處理時,會直接丟棄該任務。
7線程池的使用注意事項
1) 線程池的參數需要根據具體業務場景進行調整,以充分利用系統資源;
2) 避免使用無界隊列,因為當任務過多時,會導致內存溢出;
3) 在銷毀線程池時,需要先調用 shutdown() 方法關閉線程池,然后再調用 awaitTermination() 方法等待所有任務執行完成,最后再調用 shutdownNow() 方法強制關閉線程池。
8 java創建線程的案例
Java 創建線程常見有兩種方式
1) 繼承自 Thread 類的 MyThread 類,案例如下

2) 實現Runnable接口,案例如下
9 java創建線程池的案例
以下是一個使用 Java 創建線程池的簡單案例:

