本文共 987 字,大约阅读时间需要 3 分钟。
线程池源码解析—shutdown/Now() & tryTerminate() 方法
shutdown()
shutdown 方法用于将线程池状态设置为 SHUTDOWN,并中断所有空闲线程,最终设置为 TERMINATED 状态。该方法不会阻塞当前线程的执行。
实现步骤:
获取全局锁 mainLock,确保线程安全。 检查是否有权限执行 shutdown。 将线程池状态设置为 SHUTDOWN。 中断所有空闲的线程。 调用 onShutdown 钩子方法,供子类扩展。 最终调用 tryTerminate() 进行线程池关闭。 advanceRunState()
该方法用于改变线程池状态。通过自旋和 CAS 操作,确保状态转换的原子性和一致性。
实现细节:
使用自旋循环,确保状态转换尽可能快。 使用 CAS 操作,避免锁竞争,提升性能。 interruptIdleWorkers()
该方法用于中断线程池中的空闲线程。具体实现如下:
获取全局锁 mainLock。 遍历所有 worker。 对于处于空闲状态的线程,发送中断信号。 中断仅限于一个线程后立即停止。 shutdownNow()
shutdownNow 方法与 shutdown 有以下区别:
设置线程池状态为 STOP。 将队列中的任务导出。 中断所有线程。 调用 tryTerminate() 进行最终关闭。 实现细节:
获取全局锁 mainLock。 检查权限。 设置线程池状态为 STOP。 中断所有线程。 将任务导出到列表中。 调用 tryTerminate()。 tryTerminate()
该方法用于判断线程池是否需要终止。
实现细节:
检查线程池状态: - 如果处于 RUNNING 状态,直接返回。
- 如果处于 TIDYING 或更高状态,返回。
- 如果处于 SHUTDOWN 并且队列不为空,返回。
如果线程池处于 STOP 或 SHUTDOWN 且队列为空,且 workerCount 不为 0: 最后一个退出的线程会设置线程池状态为 TIDYING 并唤醒等待的线程。 唤醒所有线程后,线程池最终设置为 TERMINATED。 通过上述分析,可以清晰地理解线程池 shutdown 和 shutdownNow 方法的实现原理,以及如何确保线程池的安全关闭。
转载地址:http://ezhfk.baihongyu.com/