ThreadPoolExecutor 的关闭流程很简单
void shutdown()
1. 获取 mainLock 锁
2. 当前的状态如果是 SHUTDOWN ,STOP ,TIDYING ,TERMINATED 则退出
3. 如果不是则 CAS 设置状态为 SHUTDOWN
4. CAS 失败则回到 step 2 继续
5. 对所有 Worker 线程调用 interrupt() 中断阻塞
6. 释放 mainLock ,调用 tryTerminate() 关闭线程池
step 5 中断所有线程后,新的任务不能再提交进来,但是 worker 线程并不会立即退出,会继续从 workQueue 取出并执行任务,直到没有任务后再退出。所以调用 shutdown() 的线程在这里不会被阻塞,线程池会等待 workQueue 里面所有任务执行完毕以后才会变成 TERMINATED。
void tryTerminate()
1. 获取当前的线程数量,线程池状态
2. 如果线程池状态是 RUNNING、 TIDYING、 TERMINATED 直接返回
3. 如果线程池是 SHUTDOWN,但是 workQueue 还有 task,直接返回
4. 到这步,线程池状态应该是 SHUTDOWN 并且 workQueue 已经没有 task,或者是 STOP。如果线程池里面还有线程存活,call interruptIdleWorkers(true) 从 workers 里面去关闭一个闲置线程 (为什么只关闭一个?),return
5. 到这步,线程池状态应该是 SHUTDOWN 或者 STOP,workQueue 已经没有 task,线程池里面没有线程存活。获取 mainLock, CAS 操作设置状态为 TIDYING 。如果 CAS 成功,则再次设置状态为 TERMINATED, call termination.signalAll()唤醒等待线程池关闭的线程(外部线程可能 call awaitTermination(long timeout, TimeUnit unit)等待线程池彻底关闭)
6. 释放mainLock
这里的疑惑为 step 4,当线程池里面还有线程存活的时候,尝试去关闭最多一个线程。为什么是只关闭最多一个?而不是全部?注意 step 5,CAS操作设置状态为 TIDYING 。这是因为前面检查状态都是在没获取 mainLock 情况下完成的,在获取 mainlock 后重复检查成功,之后才设置 TERMINATED 状态并唤醒等待线程池关闭的线程
List<Runnable> shutdownNow()
1. 获取 mainLock 锁
2. 当前的状态如果是 STOP ,TIDYING ,TERMINATED 则退出
3. 如果不是则 CAS 设置状态为 STOP
4. CAS 失败则回到 step 2 继续
5. 对所有 Worker 线程调用 interrupt() 中断阻塞
6. 从 workQueue 里面取出所有任务,
7. 释放 mainLock ,调用 tryTerminate() 关闭线程池。返回 workQueue 里没有被执行的任务。
shutdownNow() 和 shutdown() 流程很类似,但是调用后不会等待 Worker 线程继续执行已经提交任务。相反,当前调用线程会取出任务返回。
boolean awaitTermination(long timeout, TimeUnit unit)
1. 获取 mainLock 锁
2. 当前的状态如果是 TERMINATED 则返回 true
3. 如果不是,使用和 mainLock 关联的条件 termination.awaitNanos(nanos) 等待 指定时间,超时后状态还不是 TERMINATED。 返回false。
4. 释放 mainLock 锁
调用 awaitTermination 的线程会被阻塞最多指定时间,最后是否关闭线程池成功需要判断返回值。
Java ThreadPoolExecutor 学习笔记(一)
Java ThreadPoolExecutor 学习笔记(二)
分享到:
相关推荐
Java专题学习笔记主要涵盖了Java语言的核心概念、进阶特性以及实际应用中的问题解析。这份笔记是结合了讲师的讲解和个人的整理,旨在为热爱Java编程的朋友们提供丰富的学习资源。以下将详细介绍其中可能包含的知识点...
【良葛格Java学习笔记】 本笔记主要涵盖了Java编程语言的核心概念和技术,旨在帮助初学者以及有一定基础的开发者深入理解并掌握Java。Java作为一种广泛应用于企业级应用开发、移动开发(尤其是Android)以及大数据...
Java学习笔记源码MD.rar是一个压缩包,其中包含了一系列关于Java编程语言的学习资料,特别是针对JVM(Java虚拟机),Spring框架以及Java多线程等内容的深入探讨。这些主题是Java开发中的核心部分,对于任何想要提升...
Java面试题及学习笔记概述 Java作为一种广泛应用的编程语言,其面试题库广泛且深入,涵盖了从基础语法到高级特性的各个层面。本篇将基于常见的Java面试问题,结合学习笔记,深入探讨Java的核心概念和技术。 一、...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
Java公司培训经典学习笔记是针对Java编程语言进行深入学习的一份宝贵资料,涵盖了从基础到高级的诸多知识点,旨在帮助开发者提升技能,适应企业级项目开发的需求。以下将详细阐述这些笔记中的关键点: 1. **Java...
Java JDK1.6学习笔记是一份详实的资料,涵盖了Java开发工具集(JDK)1.6版本的核心概念和技术。这份笔记对于Java初学者以及有一定经验的开发者来说都是一份宝贵的参考资料,它可能包含了从基础语法到高级特性的讲解...
本篇学习笔记将深入解析Java线程池的框架、结构、原理以及相关源码,帮助读者全面理解线程池的工作机制。 1. 线程池模块结构 线程池框架分为多层结构,其中包括核心实现类、辅助类和接口等组件。例如,`sun.nio.ch....
这篇“java学习笔记”可能包含了从基础到进阶的各种Java编程概念和技术。以下是对这些笔记可能涵盖的一些关键知识点的详细说明: 1. **Java基础知识**: - **语法**:包括变量声明、数据类型(如整型、浮点型、...
Java的ExecutorService接口提供了线程池服务,其中包括ThreadPoolExecutor和ScheduledThreadPoolExecutor等实现。 7. **Volatile**: Volatile关键字保证了变量的可见性,但不保证原子性。当多个线程访问volatile...
在这个阶段的学习中,尚硅谷提供了2023年的学习笔记和面试题,帮助你提升Java技能并为求职做好准备。 首先,多线程是Java的一个关键特性,允许程序同时执行多个任务。理解线程的创建(通过Thread类或实现Runnable...
这份学习笔记旨在帮助读者深入理解和掌握Java编程技术,以下是笔记中的主要知识点: 1. **Java基础** - **变量与数据类型**:Java有基本数据类型(如int、char、boolean等)和引用数据类型(类、接口、数组)。...
张龙老师的JAVA圣思园笔记深入浅出地涵盖了JAVA-SE的基础知识点,帮助学习者构建扎实的Java编程基础。 1. **IO(输入/输出)**: Java IO是处理数据输入和输出的重要模块,包括文件操作、流处理等。笔记中可能讲解...
Java学习笔记基础与框架 Java是一种广泛使用的面向对象的编程语言,它的设计目标是具有简单性、面向对象、健壮性、安全性、可移植性等特点。这份“java学习笔记基础和框架”涵盖了从Java的基础概念到高级特性的全...
这份“达内的Java学习笔记”涵盖了从基础到高级的Java知识体系,旨在帮助初学者和有经验的开发者深入理解Java的核心概念和技术。 1. **Java基础** - **语法结构**:了解Java的基本语法,包括数据类型(如整型、...
以上只是Java学习笔记中可能涉及的部分知识点,实际上,完整的笔记还会包含更深入的Java特性,如注解、模块系统、JDBC数据库访问、Spring框架等内容,以及实际项目开发中的最佳实践。这份笔记是初级Java程序员系统...
### Java并发编程学习笔记知识点详解 #### 一、Java并发编程概述 Java并发编程是指在Java应用程序中同时执行多个操作的技术。它通过多线程、线程池等机制实现资源的有效利用,提高程序运行效率。Java并发编程的...
这份"java笔记"涵盖了从基础到进阶的各种Java知识,旨在帮助学习者系统地掌握这门语言。以下是对笔记内容的详细解读: 1. **Java基础知识**: - **语法特性**:Java遵循C++的语法结构,但更加简洁和安全,如自动...
这份学习笔记将深入探讨Java编程语言的基础、核心概念以及J2SE中的关键特性。以下是一些重要的Java-J2SE知识点: 1. **Java语言基础**: - **变量与数据类型**:Java有基本数据类型(如int, double, boolean等)和...