更新時間:2023-06-01 來源:黑馬程序員 瀏覽量:
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(); } } }); } // 關閉線程池 executor.shutdown(); } }
在上面的代碼中,我們使用Executors.newFixedThreadPool(5)創(chuàng)建了一個固定線程數(shù)量為5的線程池。然后,通過executor.awaitTermination(keepAliveTime, TimeUnit.SECONDS)設置了線程池的keep-alive時間為5秒。這意味著如果線程池中的線程在5秒內沒有執(zhí)行任務,它們將被終止并從線程池中移除。
在執(zhí)行任務之前,我們向線程池提交了10個任務。每個任務打印了自己的ID和執(zhí)行它的線程的名稱,并在執(zhí)行完后休眠了1秒鐘。根據(jù)設置的keep-alive時間,如果在5秒內沒有新的任務提交,多余的線程將被回收。
最后,我們調用executor.shutdown()來關閉線程池,確保所有的任務執(zhí)行完畢后線程池能夠正常退出。
需要注意的是,awaitTermination()方法用于等待線程池中的所有任務完成執(zhí)行,或者等待超時時間到達。這樣做是為了確保在關閉線程池之前,所有的任務都有機會執(zhí)行完畢。