Java 线程池状态有哪些
java 线程池(threadpoolexecutor)内部使用一个原子整数 ctl 来同时存储线程池状态和线程数量。该整数的最高位用于表示状态,共有五种状态:running、shutdown、stop、tidying 和 terminated。这些状态决定了线程池对提交任务的处理方式以及工作线程的行为。

从 RUNNING 到 SHUTDOWN 的触发条件是什么
当调用 shutdown() 方法时,线程池会从 RUNNING 状态转变为 SHUTDOWN 状态。在此状态下,线程池不再接受新任务,但会继续执行已提交队列中的任务。这是最平滑的关闭方式,允许正在运行的任务完成。

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class StateDemo {
public static void main(String[] args) {
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
System.out.println("Initial state: " + getStateName(executor));
executor.submit(() -> System.out.println("Task running"));
executor.shutdown();
System.out.println("After shutdown: " + getStateName(executor));
}
private static String getStateName(ThreadPoolExecutor executor) {
try {
java.lang.reflect.Field ctlField = ThreadPoolExecutor.class.getDeclaredField("ctl");
ctlField.setAccessible(true);
long ctl = ctlField.getLong(executor);
int runState = (int) (ctl & ~0x7fffffffL); // 提取高3位
switch (runState) {
case 0: return "RUNNING";
case -536870912: return "SHUTDOWN";
case -1073741824: return "STOP";
case -1610612736: return "TIDYING";
case -2147483648: return "TERMINATED";
default: return "UNKNOWN";
}
} catch (Exception e) {
return "ERROR";
}
}
}
从 SHUTDOWN 到 STOP 的触发条件是什么
当调用 shutdownNow() 方法时,线程池会直接从 RUNNING 或 SHUTDOWN 状态转变为 STOP 状态。在 STOP 状态下,线程池不再接受新任务,也不会处理队列中剩余的任务,并尝试中断所有正在执行的工作线程。如果线程池处于 SHUTDOWN 状态,调用 shutdownNow() 也会将其升级为 STOP 状态。

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.List;
public class StopDemo {
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
executor.submit(() -> {
try { Thread.sleep(10000); } catch (InterruptedException e) {}
});
List<runnable> notExecuted = executor.shutdownNow();
System.out.println("Not executed tasks: " + notExecuted.size());
System.out.println("State after shutdownNow: " + getStateName(executor));
}
private static String getStateName(ThreadPoolExecutor executor) {
try {
java.lang.reflect.Field ctlField = ThreadPoolExecutor.class.getDeclaredField("ctl");
ctlField.setAccessible(true);
long ctl = ctlField.getLong(executor);
int runState = (int) (ctl & ~0x7fffffffL);
switch (runState) {
case 0: return "RUNNING";
case -536870912: return "SHUTDOWN";
case -1073741824: return "STOP";
case -1610612736: return "TIDYING";
case -2147483648: return "TERMINATED";
default: return "UNKNOWN";
}
} catch (Exception e) {
return "ERROR";
}
}
}</runnable>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











