在開發多線程應用程序時,我們通常必須處理組織線程的工作。我們的應用程序越大,多線程任務所需的線程越多,可運行我們創建的對象。

這裡需要注意的是,在 Java 中創建線程是一個相當昂貴的操作。如果我們每次都創建一個線程的新實例來執行一個操作,我們會在性能上遇到很大的問題,結果會影響應用程序的健康。

線程ThreadPoolExecutor在這里為我們提供幫助。

線程是一組預先初始化的線程。它的大小可以是固定的或可變的。

如果任務多於線程,則任務在任務隊列中等待。池中的第 N 個線程從隊列中取出一個任務,完成後,該線程從隊列中取出一個新任務。一旦隊列中的所有任務都執行完畢,線程將保持活動狀態並等待新任務。當新任務出現時,線程也開始執行它們。

線程池執行器

從 Java 5 開始,Executor 框架獲得了多線程解決方案。總的來說,它有很多組件,目的是幫助我們高效地管理隊列和線程池。

主要接口是ExecutorExecutorService

Executor是具有單個 void execute(Runnable runnable) 方法的接口。

將任務傳遞給此方法的實現時,知道它將來會異步執行。

ExecutorService — 擴展Executor接口的接口,添加執行任務的功能。它還具有中斷正在運行的任務和終止線程池的方法。

ThreadPoolExecutor實現了ExecutorExecutorService接口,將任務創建和任務執行分開。我們需要實現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 — 創建一個線程池,重複使用固定數量的線程來執行任意數量的任務。

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool — 創建一個線程池,其中線程數等於 JVM 可用的處理器內核數。默認並發級別為 1。這意味著將在池中創建與 JVM 可用的 CPU 內核一樣多的線程。如果並發級別為 4,則使用傳遞的值而不是核心數。

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor — 創建一個具有單個線程的池來執行所有任務。

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool — 創建一個線程池,根據需要創建新線程,但在可用時重用以前創建的線程。

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool — 創建一個線程池,可以安排命令在給定延遲後或定期執行。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

我們將在以下課程中考慮每種類型的游泳池。