首頁常見問題正文

Java中創(chuàng)建線程池有哪些核心構(gòu)造參數(shù)?

更新時間:2023-04-13 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  Java中創(chuàng)建線程池時,有以下幾個核心構(gòu)造參數(shù):

  1.corePoolSize:

  線程池中的核心線程數(shù)量,即在沒有任務(wù)需要執(zhí)行時線程池的基本大小。

  2.maximumPoolSize:

  線程池中允許的最大線程數(shù)量。

  3.keepAliveTime:

  當(dāng)線程池中的線程數(shù)量大于核心線程數(shù)量時,多余的空閑線程在等待新任務(wù)到來時能夠存活的最長時間。

  4.unit:

  keepAliveTime 參數(shù)的時間單位。

  5.workQueue:

  用于存放待執(zhí)行任務(wù)的阻塞隊列。

  6.threadFactory:

  用于創(chuàng)建新線程的工廠類。

  7.handler:

  當(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ù)。

分享到:
在線咨詢 我要報名
和我們在線交談!