更新時間:2023-04-13 來源:黑馬程序員 瀏覽量:
Java中創(chuàng)建線程池時,有以下幾個核心構(gòu)造參數(shù):
線程池中的核心線程數(shù)量,即在沒有任務(wù)需要執(zhí)行時線程池的基本大小。
線程池中允許的最大線程數(shù)量。
當(dāng)線程池中的線程數(shù)量大于核心線程數(shù)量時,多余的空閑線程在等待新任務(wù)到來時能夠存活的最長時間。
keepAliveTime 參數(shù)的時間單位。
用于存放待執(zhí)行任務(wù)的阻塞隊列。
用于創(chuàng)建新線程的工廠類。
當(dāng)線程池中的線程數(shù)量達(dá)到最大線程數(shù)量并且隊列已滿時的飽和策略,常見的策略有拋出異常、丟棄任務(wù)、丟棄隊列中最老的任務(wù)、直接在調(diào)用者線程中執(zhí)行等。
下面是一個基本的線程池創(chuàng)建和使用的代碼演示:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolDemo { public static void main(String[] args) { // 創(chuàng)建一個具有固定線程數(shù)的線程池 ExecutorService executor = Executors.newFixedThreadPool(2); // 提交任務(wù)到線程池中 for (int i = 1; i <= 10; i++) { executor.submit(new Task(i)); } // 關(guān)閉線程池 executor.shutdown(); } } class Task implements Runnable { private int taskId; public Task(int taskId) { this.taskId = taskId; } @Override public void run() { System.out.println("Task #" + taskId + " is running."); } }
這個例子中,創(chuàng)建了一個具有固定線程數(shù)(2個)的線程池,并提交了10個任務(wù)到線程池中執(zhí)行。每個任務(wù)是一個簡單的Runnable對象,只是打印了一行文本。在執(zhí)行完所有任務(wù)后,線程池會自動關(guān)閉。
如果需要指定線程池的其他構(gòu)造參數(shù),可以使用ThreadPoolExecutor類來創(chuàng)建線程池。接下來我們用一段代碼,來演示如何使用ThreadPoolExecutor類創(chuàng)建一個具有4個核心線程、最大線程數(shù)為8、空閑線程存活時間為30秒、任務(wù)隊列大小為20的線程池。
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolDemo { public static void main(String[] args) { int corePoolSize = 4; int maximumPoolSize = 8; long keepAliveTime = 30; TimeUnit unit = TimeUnit.SECONDS; ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(20); ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); // 提交任務(wù)到線程池中 for (int i = 1; i <= 20; i++) { executor.submit(new Task(i)); } // 關(guān)閉線程池 executor.shutdown(); } } class Task implements Runnable { private int taskId; public Task(int taskId) { this.taskId = taskId; } @Override public void run() { System.out.println("Task #" + taskId + " is running."); } }
在這個例子中,首先定義了線程池的各個構(gòu)造參數(shù),然后使用ThreadPoolExecutor類創(chuàng)建了一個具有指定參數(shù)的線程池。這個例子中,任務(wù)隊列使用了一個ArrayBlockingQueue,它可以存儲20個任務(wù)。在執(zhí)行完所有任務(wù)后,線程池會自動關(guān)閉。
除了使用ThreadPoolExecutor類,還可以使用Executors類的其他靜態(tài)工廠方法來創(chuàng)建不同類型的線程池:
1.創(chuàng)建一個具有單個線程的線程池,適用于需要按順序執(zhí)行任務(wù)的情況。
ExecutorService executor = Executors.newSingleThreadExecutor();
2.創(chuàng)建一個具有固定線程數(shù)的線程池,適用于需要保證線程數(shù)量固定的情況。
ExecutorService executor = Executors.newFixedThreadPool(4);
3.創(chuàng)建一個具有緩存的線程池,適用于需要執(zhí)行大量短期異步任務(wù)的情況。這個線程池會根據(jù)任務(wù)的數(shù)量動態(tài)調(diào)整線程數(shù)量,如果線程池中的線程閑置時間超過60秒,這些線程就會被終止并從線程池中移除。
ExecutorService executor = Executors.newCachedThreadPool();
4.創(chuàng)建一個具有調(diào)度功能的線程池,適用于需要按一定間隔執(zhí)行任務(wù)的情況。這個線程池會在指定的延遲后,周期性地執(zhí)行任務(wù)。
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); executor.scheduleAtFixedRate(new Task(), 0, 1, TimeUnit.SECONDS);
在這個例子中,創(chuàng)建了一個具有兩個線程的ScheduledExecutorService,然后使用scheduleAtFixedRate方法來周期性地執(zhí)行任務(wù)。這個方法的參數(shù)說明:第一個參數(shù)是要執(zhí)行的任務(wù),第二個參數(shù)是任務(wù)的初始延遲時間,第三個參數(shù)是任務(wù)的執(zhí)行周期,第四個參數(shù)是時間單位。
總的來說,Java中的線程池提供了一種高效管理線程的方式,能夠避免頻繁創(chuàng)建和銷毀線程,提高程序的性能和穩(wěn)定性。在使用線程池時,需要根據(jù)實際情況選擇不同類型的線程池和合適的構(gòu)造參數(shù)。