线程池 shutdown和shutdwonnow

本文详细解析了线程池中shutdown与shutdownNow方法的区别。shutdown方法将阻止线程池接收新任务,允许已运行任务完成;而shutdownNow不仅阻止新任务,还会尝试中断正在运行的任务,除非任务正处于不可中断状态,如未处于sleep状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shutdown 使得线程池不在接收新的任务,已经运行的任务会运行完毕,没运行的任务会被直接抛弃

 

shutdownnow 使得线程池不在接收新的任务,同时会给正在运行的任务发送Interrupted信号,当运行的线程处于sleep是就会抛出InterruptedException异常,如果运行的线程没有sleep,那么则会正常的运行完毕。

 

 

### Java 线程池 `shutdown` 方法使用教程与最佳实践 #### 正确关闭线程池的方法 为了确保线程池能安全地完成所有已提交的任务并最终释放资源,应当遵循一定的流程来关闭线程池。通常情况下,推荐先调用 `shutdown()` 方法让线程池进入平缓的关闭过程,在此期间它不会再接收新的任务请求,但仍会继续执行已经存在于工作队列中的任务。 ```java // 假设 executor 是之前创建好的 ThreadPoolExecutor 实例 executor.shutdown(); try { if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { // 尝试等待最多60秒直到所有任务结束 executor.shutdownNow(); // 如果超时则尝试强制终止剩余未完成的任务 } } catch (InterruptedException e) { executor.shutdownNow(); // 中断发生时也应立即尝试强行停止 } ``` 这段代码展示了如何优雅地关闭一个线程池实例[^4]。当 `awaitTermination(long timeout, TimeUnit unit)` 返回 false 表明即使经过指定的时间间隔仍有部分任务未能完成;这时可以选择再次调用 `shutdownNow()`, 它不仅会使线程池状态转变为 STOP 而且还会试图中断那些还在运行着的任务,并清空掉待处理的任务列表[^3]。 需要注意的是,只有当任务本身支持响应中断信号的情况下,`shutdownNow()` 才可能成功地中止它们的工作。因此编写可取消的任务逻辑是非常重要的,比如定期检查当前线程是否已被标记为中断状态并通过抛出异常的方式提前退出循环体或其他长时间操作。 #### 处理线程池关闭后的资源回收 一旦确认所有的任务都已经顺利完成或是被适当地打断之后,就可以着手清理其他依赖于该线程池存在的外部资源了。例如数据库连接、文件句柄等都需要在此刻得到妥善处置以免造成泄露风险。不过在此之前最好再验证一次线程池确实处于完全停机的状态: ```java if (executor.isTerminated()) { // 进行必要的资源释放动作... } ``` 上述做法有助于防止因过早进行后续步骤而导致潜在的数据不一致或者其他难以追踪的问题出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值