写在开头
面试官:“小伙子,线程池使用过吗,来聊一聊它吧!”
我:“好的,然后巴拉巴拉一顿输出之前看过的build哥线程池十八问…”
面试官满意的点了点头,紧接着问道:“那你知道如何优雅的关闭线程池吗?”
我:“知道知道,直接调用shutdownNow()方法就好了呀!”
面试官脸色一变,微怒道:“粗鲁!你给我滚出去!!!”
优雅的关闭线程池
哈哈,上面的场景是build哥臆想出来的面试画面,我们现在步入正题,来看一看在线程池使用完成后如何优雅的关闭线程池。
在JDK 1.8 中,Java 并发工具包中 java.util.concurrent.ExecutorService 提供了 shutdown()、shutdownNow()这两种接口方法去关闭线程池,我们分别看一下。
shutdown()
public void shutdown() {
final ReentrantLock mainLock = this.mainLock; // ThreadPoolExecutor的主锁
mainLock.lock(); // 加锁以确保独占访问
try {
checkShutdownAccess(); // 检查是否有关闭的权限
advanceRunState(SHUTDOWN); // 将执行器的状态更新为SHUTDOWN
interruptIdleWorkers(); // 中断所有闲置的工作线程
onShutdown(); // ScheduledThreadPoolExecutor中的挂钩方法,可供子类重写以进行额外操作
} finally {
mainLock.unlock(); // 无论try块如何退出都要释放锁
}
tryTerminate(); // 如果条件允许,尝试终止执行器
}
在shutdown的源码中,会启动一次顺序关闭,在这次关闭中,执行器不再接受新任务,但会继续处理队列中的已存在任务,当所有任务都完成后,线程池中的线程会逐渐退出。
我们写一个小的demo来使用shutdown():
public class TestService{
public static void main(String[] args) {
//创建固定 3 个线程的线程池,测试使用,工作中推荐ThreadPoolExecutor
ExecutorService threadPool = Executors.newFixedThreadPool(3
标签:shutdown,执行器,面试官,shutdownNow,mainLock,线程,关闭
From: https://blog.csdn.net/qq_43506040/article/details/139296388