发布于2026-07-09 阅读(0)
扫一扫,手机访问
线程池中的线程,在完成一个任务后并不会立刻"退役",而是进入一种待命状态——空闲等待,准备接手新任务,或者听从线程池生命周期管理指令的"调遣"。具体往哪个状态转换,得看线程池的配置(核心线程数、最大线程数、存活时间)、任务队列的类型,以及线程池当前所处的生命周期阶段(运行、关闭、终止)。

本质上,线程执行完任务后的行为,就是在队列等待和退出之间做选择,而选择的依据就是这些参数和状态。
说到底,线程完成一个任务后,会立即从阻塞队列里"抢"下一个任务。这个动作的核心就是调用了 BlockingQueue.take() 或带超时的 poll(keepAliveTime, unit):
LinkedBlockingQueue),核心线程就会一直在 take() 上阻塞,没有超时机制,所以它们能长期存活下去;SynchronousQueue),非核心线程就会调用带超时的 poll(),只等待指定的 keepAliveTime;注意,核心线程和非核心线程在这里的处理方式天然不同,这也是线程池能够"按需管理"线程数量的关键。
调用了 shutdown() 之后,线程池不再接收新任务,但已经提交的任务会继续运行,这是一个比较温和的关闭方式:
TIDYING 状态,随后调用 terminated() 进入 TERMINATED 状态,整个过程有序收敛。相比优雅的 shutdown(),shutdownNow() 就显得比较暴力了——它会试图立马停下来,通过中断机制给每个线程发送"停止信号":
Thread.interrupt();sleep、wait、BlockingQueue.poll),会抛出 InterruptedException 并提前退出;Thread.interrupted() 或未捕获异常),线程可能继续运行直到自然结束——所以这种关闭方式并不能保证百分之百立即终止。线程池之所以能复用线程,关键在于内部的 Worker 类。每个 Worker 都是一个独立的执行单元:
Worker 继承自 AQS,用独占锁保障状态变更(比如 runState)的原子性,这样在并发环境下状态切换不会乱;NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED)由 JVM 管理,而线程池维护的是逻辑状态(RUNNING/SHUTDOWN/STOP/TIDYING/TERMINATED),两者隔离但互相影响;Thread 对象生命周期远长于单个任务,这才是线程复用的底层机制。理解了这些细节,就能更清楚地把握线程池在不同场景下的行为——不仅是理论上的"状态转换图",更是实际开发中调优和排错的基础。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8