线程池shutdown(),shutdownNow()的区别

date
Sep 27, 2021
slug
线程池shutdown(),shutdownNow()的区别
status
Published
tags
多线程
summary
type
Post
通过查看源码(jdk 17)比较shutdown()与shutdownNow()区别
线程池通过一个原子整数(AtomicInteger)来记录线程池状态runState和线程数量workerCountrunState在高3位,后29位用来记录workerCount
runState 取值如下:
RUNNING:接受新任务并处理排队任务
SHUTDOWN:不接受新任务,但处理排队任务
STOP:不接受新任务,不处理排队任务, 并中断正在进行的任务
TIDYING:所有任务都已终止,workerCount 为零,线程转换到状态 TIDYING 将运行terminated()钩子方法
TERMINATEDterminated()方法已完成
这些值之间的数字顺序很重要,以允许有序比较 。 runState 随着时间的推移单调增加,但不需要达到每个状态。

shutdown()

shutdown方法将线程池的状态设置为SHUTDOWN,此时线程不接受新提交的线程了,但是会处理队列里面的线程和正在执行的线程。虽然线程会等待任务队列的线程处理完,但该方法不会阻塞。如果线程池有闲置的线程,那也将它关闭。
 

shutdownNow()

shutdownNow方法会打断现在正在运行的线程,任务队列中的线程也不会处理了,线程池的状态设置为STOP
 

awaitTermination

这个方法会阻塞直到线程池中提交的任务全部执行完,或者超时或者被打断。所以可以用该方法来优雅关闭线程池。例如在Spring Boot中可以这样用:

© Ryan Tang 2021 - 2025