更新時(shí)間:2023-06-01 來(lái)源:黑馬程序員 瀏覽量:
Java線程池中多余的線程是通過(guò)線程池的"keep-alive"機(jī)制來(lái)回收的。該機(jī)制定義了線程池中多余的線程的存活時(shí)間,在超過(guò)該時(shí)間后,空閑的線程將被終止并從線程池中移除。
接下來(lái)我們看一段示例代碼,演示了如何創(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的線程池。然后,通過(guò)executor.awaitTermination(keepAliveTime, TimeUnit.SECONDS)設(shè)置了線程池的keep-alive時(shí)間為5秒。這意味著如果線程池中的線程在5秒內(nèi)沒(méi)有執(zhí)行任務(wù),它們將被終止并從線程池中移除。
在執(zhí)行任務(wù)之前,我們向線程池提交了10個(gè)任務(wù)。每個(gè)任務(wù)打印了自己的ID和執(zhí)行它的線程的名稱,并在執(zhí)行完后休眠了1秒鐘。根據(jù)設(shè)置的keep-alive時(shí)間,如果在5秒內(nèi)沒(méi)有新的任務(wù)提交,多余的線程將被回收。
最后,我們調(diào)用executor.shutdown()來(lái)關(guān)閉線程池,確保所有的任務(wù)執(zhí)行完畢后線程池能夠正常退出。
需要注意的是,awaitTermination()方法用于等待線程池中的所有任務(wù)完成執(zhí)行,或者等待超時(shí)時(shí)間到達(dá)。這樣做是為了確保在關(guān)閉線程池之前,所有的任務(wù)都有機(jī)會(huì)執(zhí)行完畢。