Java ThreadPoolExecutor 源码深度解析

需积分: 9 4 下载量 137 浏览量 更新于2024-08-29 收藏 12KB MD 举报
“ThreadPoolExecutor源码解析” 在Java并发编程中,`ThreadPoolExecutor`是执行任务的核心类,它基于`ExecutorService`接口并提供了更丰富的功能。本文将深入解析`ThreadPoolExecutor`的源码,特别是其内部管理和控制线程池状态的关键变量。 1. **ctl变量** `ctl`是一个`AtomicInteger`对象,它结合了线程池的状态和工作线程的数量。高3位用于存储线程池的状态,低29位用于存储工作线程的数量。这种设计允许在一个变量中同时存储两种信息,减少了内存开销,也确保了状态更新的原子性。 2. **COUNT_BITS** `COUNT_BITS`等于`Integer.SIZE - 3`,即32(一个int类型的位数)减去3,结果是29。这表示`ctl`的低29位用于存储工作线程的数量,因为`CAPACITY`定义为2的29次方减1,这是线程池能容纳的最大工作线程数。 3. **CAPACITY** `CAPACITY`是线程池能容纳的最大工作线程数,计算方式为`1 << COUNT_BITS` - 1,即2^29 - 1,大约是536,870,911个线程。 4. **线程池状态** 线程池有五种状态,按照顺序排列如下: - `RUNNING`: 执行新提交的任务。 - `SHUTDOWN`: 不接受新任务,但继续处理已提交的任务。 - `STOP`: 不接受新任务,也不处理已提交的任务,正在等待所有工作线程结束。 - `TIDYING`: 所有工作线程已经终止,线程池即将进入`TERMINATED`状态。 - `TERMINATED`: 线程池已经终止,所有资源已被释放。 5. **runStateOf()** 这个方法用于获取线程池的状态,通过按位与操作`c & ~CAPACITY`,将`ctl`的低29位清零,只保留高3位的状态信息。 6. **workerCountOf()** 这个方法用于获取工作线程的数量,通过按位与操作`c & CAPACITY`,将`ctl`的高3位清零,只保留低29位的worker计数。 7. **ctlOf()** `ctlOf()`方法用于根据线程池状态`rs`和工作线程数量`wc`生成`ctl`值,通过按位或操作`rs | wc`将两者合并到一个`ctl`值中。 理解这些关键变量及其作用对于深入理解`ThreadPoolExecutor`的工作原理至关重要。在实际使用中,线程池的状态转换、工作线程的创建和销毁、任务的调度等都是围绕这些变量进行的。例如,当线程池状态改变时,`ctl`的更新是通过原子操作完成的,保证了并发环境下的正确性。而`workerCountOf()`和`runStateOf()`方法则提供了解析`ctl`值来获取当前状态和工作线程数的方法。这些细节展示了`ThreadPoolExecutor`如何高效地管理线程和任务,是Java并发编程中的重要知识。