ThreadPoolExecutor 的 STOP 状态是什么
stop 是 java java.util.concurrent.threadpoolexecutor 线程池生命周期中的第二个状态,表示线程池已停止接受新任务,并正在中断所有正在执行的任务。该状态通过调用 shutdownnow() 方法进入,一旦进入此状态,线程池将不再处理队列中剩余的任务。

如何从 RUNNING 状态进入 STOP 状态
要从默认的 RUNNING 状态进入 STOP 状态,必须显式调用 shutdownNow() 方法。该方法会尝试停止所有活动的工作线程,并返回等待执行的任务列表。与 shutdown() 不同,shutdownNow() 不会等待当前正在执行的任务完成,而是直接发送中断信号。

import java.util.concurrent.*;
public class StopStateDemo {
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()
);
// 提交一个任务
executor.submit(() -> {
try {
Thread.sleep(5000); // 模拟长时间运行
} catch (InterruptedException e) {
System.out.println("Task interrupted: " + e.getMessage());
}
});
// 短暂等待以确保任务开始执行
Thread.sleep(100);
// 调用 shutdownNow 进入 STOP 状态
List<runnable> notExecuted = executor.shutdownNow();
System.out.println("Pool state after shutdownNow: " + executor.isShutdown());
System.out.println("Tasks returned: " + notExecuted.size());
// 等待任务结束或中断
executor.awaitTermination(1, TimeUnit.SECONDS);
System.out.println("Final state: TERMINATED? " + executor.isTerminated());
}
}</runnable>
预期结果:控制台输出显示任务被中断(打印 "Task interrupted: null"),并且 shutdownNow() 返回的列表为空(因为任务已经开始执行,不在队列中)。线程池最终可能进入 TERMINATED 状态,如果所有工作线程都因中断而退出。
基于程序中某个输入、条件或结果的具体问题
在上面的代码中,当 shutdownNow()被调用时,如果任务正在执行中,它会收到 InterruptedException。这是 STOP 状态的一个关键行为特征:它不保证任务立即停止,而是依赖任务代码正确处理中断信号。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











