要關閉Java中的FixedThreadPool,您需要調用shutdown()
或shutdownNow()
方法。這兩個方法的主要區別在于它們處理正在執行任務的方式。
shutdown()
: 這個方法將啟動線程池的關閉過程。已經提交的任務將繼續執行,但不再接受新任務。這個方法不會立即關閉線程池,而是等待所有任務完成后才關閉。ExecutorService executorService = Executors.newFixedThreadPool(5);
// 提交并執行任務...
executorService.shutdown(); // 關閉線程池
shutdownNow()
: 這個方法將嘗試立即停止所有正在執行的任務,并返回尚未開始執行的任務列表。這個方法無法保證能夠立即停止所有任務,因為它們可能在執行過程中不響應中斷。ExecutorService executorService = Executors.newFixedThreadPool(5);
// 提交并執行任務...
List<Runnable> unfinishedTasks = executorService.shutdownNow(); // 立即關閉線程池,返回未完成任務列表
在關閉線程池后,您可以使用awaitTermination()
方法等待所有任務完成。這個方法會阻塞當前線程,直到所有任務完成或超時(可選)。
executorService.shutdown();
try {
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
}
這樣,您就可以確保線程池被正確關閉,所有任務都已完成,或者被取消。