首頁常見問題正文

線程池中多余的線程是如何回收的?

更新時(shí)間:2023-06-01 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  Java線程池中多余的線程是通過線程池的"keep-alive"機(jī)制來回收的。該機(jī)制定義了線程池中多余的線程的存活時(shí)間,在超過該時(shí)間后,空閑的線程將被終止并從線程池中移除。

  接下來我們看一段示例代碼,演示了如何創(chuàng)建一個(gè)線程池并設(shè)置"keep-alive"時(shí)間:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExample {
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建一個(gè)具有固定線程數(shù)量的線程池
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 設(shè)置線程池的keep-alive時(shí)間為5秒
        int keepAliveTime = 5;
        executor.awaitTermination(keepAliveTime, TimeUnit.SECONDS);

        // 執(zhí)行一些任務(wù)
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executor.execute(new Runnable() {
                public void run() {
                    System.out.println("Task " + taskId + " executed by " + Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        // 關(guān)閉線程池
        executor.shutdown();
    }
}

  在上面的代碼中,我們使用Executors.newFixedThreadPool(5)創(chuàng)建了一個(gè)固定線程數(shù)量為5的線程池。然后,通過executor.awaitTermination(keepAliveTime, TimeUnit.SECONDS)設(shè)置了線程池的keep-alive時(shí)間為5秒。這意味著如果線程池中的線程在5秒內(nèi)沒有執(zhí)行任務(wù),它們將被終止并從線程池中移除。

1685583028023_如何回收線程池中多余的線程.jpg

  在執(zhí)行任務(wù)之前,我們向線程池提交了10個(gè)任務(wù)。每個(gè)任務(wù)打印了自己的ID和執(zhí)行它的線程的名稱,并在執(zhí)行完后休眠了1秒鐘。根據(jù)設(shè)置的keep-alive時(shí)間,如果在5秒內(nèi)沒有新的任務(wù)提交,多余的線程將被回收。

  最后,我們調(diào)用executor.shutdown()來關(guān)閉線程池,確保所有的任務(wù)執(zhí)行完畢后線程池能夠正常退出。

  需要注意的是,awaitTermination()方法用于等待線程池中的所有任務(wù)完成執(zhí)行,或者等待超時(shí)時(shí)間到達(dá)。這樣做是為了確保在關(guān)閉線程池之前,所有的任務(wù)都有機(jī)會執(zhí)行完畢。

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!