在開發多線程應用程序時,我們通常必須處理組織線程的工作。我們的應用程序越大,多線程任務所需的線程越多,可運行我們創建的對象。
這裡需要注意的是,在 Java 中創建線程是一個相當昂貴的操作。如果我們每次都創建一個線程的新實例來執行一個操作,我們會在性能上遇到很大的問題,結果會影響應用程序的健康。
線程池和ThreadPoolExecutor在這里為我們提供幫助。
線程池是一組預先初始化的線程。它的大小可以是固定的或可變的。

如果任務多於線程,則任務在任務隊列中等待。池中的第 N 個線程從隊列中取出一個任務,完成後,該線程從隊列中取出一個新任務。一旦隊列中的所有任務都執行完畢,線程將保持活動狀態並等待新任務。當新任務出現時,線程也開始執行它們。
線程池執行器
從 Java 5 開始,Executor 框架獲得了多線程解決方案。總的來說,它有很多組件,目的是幫助我們高效地管理隊列和線程池。
主要接口是Executor和ExecutorService。
Executor是具有單個 void execute(Runnable runnable) 方法的接口。
將任務傳遞給此方法的實現時,知道它將來會異步執行。
ExecutorService — 擴展Executor接口的接口,添加執行任務的功能。它還具有中斷正在運行的任務和終止線程池的方法。
ThreadPoolExecutor實現了Executor和ExecutorService接口,將任務創建和任務執行分開。我們需要實現Runnable對象並將它們發送給執行程序。然後ThreadPoolExecutor負責執行任務,創建和使用線程。

發送任務執行後,將使用池中的現有線程。這提高了性能。它解決了在創建和初始化新線程時浪費資源的問題,然後在我們完成線程後再次在垃圾收集上浪費資源。
ThreadPoolExecutor有 4 個構造函數:
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
ThreadPoolExecutor構造函數具有以下參數:
核心池大小 | 該參數表示執行器服務啟動時將準備好(啟動)多少個線程。 |
最大池大小 | 執行程序服務可以創建的最大線程數。 |
保活時間 | 如果線程數大於,則釋放的線程在被銷毀之前將繼續存在的時間核心池大小. 時間單位在下一個參數中指定。 |
單元 | 時間單位(小時、分鐘、秒、毫秒等)。 |
工作隊列 | 任務隊列的實現。 |
處理程序 | 無法完成的任務的處理程序。 |
線程工廠 | 按需創建新線程的對象。使用線程工廠使得對新線程的調用與硬件無關,允許應用程序使用特殊的線程子類、優先級等。 |
創建線程池執行器
Executors實用程序類可以簡化ThreadPoolExecutor的創建。這個實用類的方法幫助我們準備一個線程池執行器目的。
newFixedThreadPool — 創建一個線程池,重複使用固定數量的線程來執行任意數量的任務。 |
|
newWorkStealingPool — 創建一個線程池,其中線程數等於 JVM 可用的處理器內核數。默認並發級別為 1。這意味著將在池中創建與 JVM 可用的 CPU 內核一樣多的線程。如果並發級別為 4,則使用傳遞的值而不是核心數。 |
|
newSingleThreadExecutor — 創建一個具有單個線程的池來執行所有任務。 |
|
newCachedThreadPool — 創建一個線程池,根據需要創建新線程,但在可用時重用以前創建的線程。 |
|
newScheduledThreadPool — 創建一個線程池,可以安排命令在給定延遲後或定期執行。 |
|
我們將在以下課程中考慮每種類型的游泳池。
GO TO FULL VERSION