首頁常見問題正文

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

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

IT培訓班

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

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

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)建一個具有固定線程數(shù)量的線程池
        ExecutorService executor = Executors.newFixedThreadPool(5);

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

        // 執(zhí)行一些任務
        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)建了一個固定線程數(shù)量為5的線程池。然后,通過executor.awaitTermination(keepAliveTime, TimeUnit.SECONDS)設置了線程池的keep-alive時間為5秒。這意味著如果線程池中的線程在5秒內(nèi)沒有執(zhí)行任務,它們將被終止并從線程池中移除。

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

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

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

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

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