java如何关闭线程池
关闭线程池的方法
在Java中,关闭线程池可以通过ExecutorService接口提供的方法实现。以下是几种常用的关闭线程池的方式:
使用shutdown方法
shutdown方法会平滑地关闭线程池,不再接受新任务,但会等待已提交的任务执行完成。

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.shutdown();
使用shutdownNow方法
shutdownNow方法会立即尝试停止所有正在执行的任务,并返回等待执行的任务列表。该方法通过中断线程来实现。

ExecutorService executor = Executors.newFixedThreadPool(5);
List<Runnable> notExecutedTasks = executor.shutdownNow();
结合awaitTermination方法
awaitTermination方法可以等待线程池中的任务在指定时间内完成。如果超时后仍有任务未完成,可以强制关闭。
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
使用try-with-resources(Java 9+)
从Java 9开始,ExecutorService扩展了AutoCloseable接口,可以使用try-with-resources语法自动关闭线程池。
try (ExecutorService executor = Executors.newFixedThreadPool(5)) {
// 提交任务
} // 自动调用shutdown
注意事项
- 调用
shutdown或shutdownNow后,线程池状态变为SHUTDOWN或STOP,无法再提交新任务。 - 使用
shutdownNow时,任务可能无法正常完成,需确保任务能正确处理中断。 - 建议结合
awaitTermination使用,避免任务未完成时直接关闭线程池。






