如何优雅的关闭线程池
要确保线程池能够优雅退出,所有任务都应该遵循以下准则:
- 响应中断:在任务中检查当前线程的中断状态,适时退出长时间运行的循环。
- 清理资源:即使在捕获到中断异常时,也要确保所有在任务中分配的资源得到释放。
- 恢复状态:若任务被中断,确保能够将涉及的数据或状态恢复到一个安全的状态。
1、shutdown
- 将会拒绝新任务提交到线程池;
- 等待待执行和正在执行的任务执行结束
executorService.shutdown();
2、shutdownNow
- 将会拒绝新任务提交到线程池;
- 取消待执行的任务
- 尝试取消执行中的任务
executorService.shutdownNow();
3、awaitTermination();
阻塞下面的代码执行,直到线程池任务执行完毕或者超时,一般用于设置回调
executor.awaitTermination(2, TimeUnit.SECONDS)
4、常规用法
try {// 等待所有任务完成,最多等待 3 秒if (!executor.awaitTermination(2, TimeUnit.SECONDS)) {// 如果超时还未完成,强制关闭线程池executor.shutdownNow();}} catch (InterruptedException e) {// 如果当前线程在等待时被中断,也强制关闭线程池executor.shutdownNow();Thread.currentThread().interrupt();}
参考:
Java线程池的shutdownnow()方法为什么不能停止运行的任务?_shutdownnow 关闭不了-CSDN博客
如何优雅的关闭Java线程池 - 清泉^_^ - 博客园
实战解析:如何确保Java线程池的优雅终结_java awaittermination-CSDN博客
java 并发之awaitTermination的使用-CSDN博客
Spring环境中正确关闭线程池的姿势_springboot 关闭线程池-CSDN博客