shutdown()后线程池将变成shutdown状态此时不接收新任务,但会处理完正在运行的 和 在阻塞队列中等待处理的任务
shutdownNow()后线程池将变成stop状态,此时不接收新任务不再处理在阻塞队列中等待的任务,还会尝试中断正在处理中的工作线程
2、判断线程池中是否还有线程,有则 interruptIdleWorkers(ONLY_ONE) 尝试中断一个空闲线程(正是这个逻辑可以再次发絀中断信号中断阻塞在获取任务的线程)
* 尝试停止所有活动的正在执行的任务,停止等待任务的处理并返回正在等待被执行的任务列表
* 这个任务列表是从任务队列中排出(删除)的
* 这个方法不用等到正在执行的任务结束,要等待线程池终止可使用awaitTermination()
* 除了尽力尝试停止运行Φ的任务没有任何保证
* 取消任务是通过Thread.interrupt()实现的,所以任何响应中断失败的任务可能永远不会结束
|
1、将线程池更新为stop状态
需要注意的是對于运行中的线程调用Thread.interrupt()并不能保证线程被终止,task.run()内部可能捕获了InterruptException没有上抛,导致线程一直无法结束
阻塞等待过程中发生以下具体情况会解除阻塞(对上面3种情况的解释):
故终止线程池并需要知道其是否终止可以用如下方式: