优雅地关闭 Java ExecutorService
执行器是在 Java 应用程序中同时管理和执行任务的便捷方法。但是,不正确的关闭可能会导致意外行为或性能问题。本指南详细说明了如何正确关闭 ExecutorService,确保所有任务都终止或取消。
了解 ExecutorService 关闭
ExecutorService 提供两种主要关闭方法:
需要注意的是,shutdown 并不能保证终止所有任务。无法响应中断或具有长时间运行操作的任务可能会保持活动状态。
推荐的关闭过程
Oracle 文档建议使用以下方法来正常关闭:
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown();
try {
// Wait for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow();
// Wait for tasks to respond to cancellation
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
pool.shutdownNow();
Thread.currentThread().interrupt();
}
}
此方法可确保允许完成现有任务,同时防止新的提交。如果关闭过程花费的时间比预期长,您可以将
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
替换为
while (!pool.awaitTermination(60, TimeUnit.SECONDS))
继续等待任务完成。
关机方法总结
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3