更新時間:2023-06-19 來源:黑馬程序員 瀏覽量:
在Java中,線程池的關(guān)閉方式有三種:shutdown()、shutdownNow()和awaitTermination()。
·該方法會平滑地關(guān)閉線程池,不再接受新的任務(wù)提交。
·它會等待所有已提交的任務(wù)執(zhí)行完畢,包括已經(jīng)在等待隊列中的任務(wù)。
·如果線程池已經(jīng)關(guān)閉,則調(diào)用該方法沒有任何效果。
ExecutorService executor = Executors.newFixedThreadPool(5); // 執(zhí)行任務(wù)... executor.shutdown(); // 關(guān)閉線程池 // 等待線程池中的任務(wù)執(zhí)行完畢 try { executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { // 處理中斷異常 }
·該方法會強制關(guān)閉線程池,嘗試中斷正在執(zhí)行的任務(wù),并返回等待執(zhí)行的任務(wù)列表。
·它會立即停止線程池的運行,不再處理等待隊列中的任務(wù)。
·如果線程池已經(jīng)關(guān)閉,則調(diào)用該方法沒有任何效果。
ExecutorService executor = Executors.newFixedThreadPool(5); // 執(zhí)行任務(wù)... List<Runnable> unprocessedTasks = executor.shutdownNow(); // 強制關(guān)閉線程池 // 處理未執(zhí)行的任務(wù) for (Runnable task : unprocessedTasks) { // 處理未執(zhí)行的任務(wù)... }
·該方法用于等待線程池中的任務(wù)執(zhí)行完畢,或者在指定的時間內(nèi)等待任務(wù)執(zhí)行完畢。
·它會阻塞當(dāng)前線程,直到滿足以下條件之一:所有任務(wù)執(zhí)行完畢、超過指定的等待時間、當(dāng)前線程被中斷。
這些關(guān)閉方式可以根據(jù)具體需求選擇合適的方法,shutdown()和awaitTermination()提供了一種平滑關(guān)閉線程池的方式,而shutdownNow()則提供了一種立即停止線程池的方式。
ExecutorService executor = Executors.newFixedThreadPool(5); // 執(zhí)行任務(wù)... executor.shutdown(); // 關(guān)閉線程池 // 等待線程池中的任務(wù)執(zhí)行完畢,最多等待1小時 try { if (!executor.awaitTermination(1, TimeUnit.HOURS)) { // 執(zhí)行超時處理 } } catch (InterruptedException e) { // 處理中斷異常 }