线程池优雅关闭

本文详细解释了如何优雅地关闭Java线程池,包括逐步过程:关闭接收新任务、等待执行完成、强制停止未完成任务并确保线程终止。重点强调了在处理异常时线程的终止机制。
摘要由CSDN通过智能技术生成

背景

线程池是日常我们写代码时经常打交道的知识点了,围绕线程池除了core核心线程数和最大max线程数的知识点外,我们一般会忽略然而却绕不开的问题时如何关闭线程池

如何关闭线程池

首先从优雅关闭线程池代码说起:

public boolean grafulShutdown(){
executeService.shutdown();
if (!executeService.awaitTermination(timeout, TimeUnit.MILLISECONDS)) {  
executeService.shutdownNow(); 
if(!executeService.awaitTermination(timeout, TimeUnit.MILLISECONDS)){
    return executeService.isTerminated;
}
}
}

第一步:关闭线程池,此时线程不再接受新的任务,并且队列中待执行的任务也会被拒绝掉
executeService.shutdown();
第二步: 等待执行中的线程执行结束,此时线程池中的线程不会收到stop信号的干扰,按部就班的执行
if (!executeService.awaitTermination(timeout, TimeUnit.MILLISECONDS)) {
第三步:等待了很久线程都没有执行完成,此时调用 shutdownNow方法对线程池中正在执行的线程发送stop信号,如果此时线程正在进行socket等操作,会响应stop信号抛出异常,当线程收到异常后,线程中止
executeService.shutdownNow();
}
第四步:继续等待线程池中的线程中止,此时执行中的线程都已经收到stop信号.
executeService.awaitTermination(timeout, TimeUnit.MILLISECONDS)
第五步:返回线程池是否结束的标志,此时你除了知道线程池是否结束之外,也做不了任何事情了.
executeService.isTerminated

这些步骤里面值得注意的就是第三步,当执行线程catch住异常后是如何结束的:
在这里插入图片描述
在这里插入图片描述
当接收到异常后,线程就会执行processWorkerExit方法减少当前线程数,当线程数减少到0后,就会把线程池状态修改成Terminated状态.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值