更新時間:2023-04-13 來源:黑馬程序員 瀏覽量:
IT就到黑馬程序員.gif)
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ù)。
1024首播|39歲程序員逆襲記:不被年齡定義,AI浪潮里再迎春天
2025-10-241024程序員節(jié)丨10年同行,致敬用代碼改變世界的你
2025-10-24【AI設(shè)計】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運(yùn)營】深圳跨境電商運(yùn)營畢業(yè)22個工作日,就業(yè)率91%+,最高薪資達(dá)13500元
2025-09-19【AI運(yùn)維】鄭州運(yùn)維1期就業(yè)班,畢業(yè)14個工作日,班級93%同學(xué)已拿到Offer, 一線均薪資 1W+
2025-09-19【AI鴻蒙開發(fā)】上海校區(qū)AI鴻蒙開發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19