原创

java面试题-线程池有哪几种状态

1. 线程池的状态

Java 线程池包含以下 5 种状态:

  1. RUNNING(运行中):线程池一旦被创建,就处于 RUNNING 状态。在这个状态下,线程池能够接收新任务,并对已排队的任务进行处理。

  2. SHUTDOWN(关闭中):线程池不接收新任务,但能够处理已排队的任务。当调用线程池的 shutdown() 方法时,线程池由 RUNNING 转变为 SHUTDOWN 状态。

  3. STOP(停止中):线程池不接收新任务,不处理已排队的任务,并且会中断正在处理的任务。调用线程池的 shutdownNow() 方法,线程池由(RUNNING 或 SHUTDOWN)转变为 STOP 状态。

  4. TIDYING(整理中)

    • 在 SHUTDOWN 状态下,任务数为 0,其他所有任务已终止,线程池会变为 TIDYING 状态,并执行 terminated() 方法。线程池中的 terminated() 方法是空实现,可以重写该方法进行相应的处理。
    • 在线程池处于 SHUTDOWN 状态时,任务队列为空且执行中任务为空,线程池就会由 SHUTDOWN 转变为 TIDYING 状态。
    • 在线程池处于 STOP 状态时,线程池中执行中任务为空时,就会由 STOP 转变为 TIDYING 状态。
  5. TERMINATED(终止):线程池彻底终止。线程池在 TIDYING 状态执行完 terminated() 方法就会由 TIDYING 转变为 TERMINATED 状态。

2. 线程池状态转换

线程池状态的转换是通过位运算实现的,以下是对应的源码解析:

// runState is stored in the high-order bits
private static final int RUNNING    = -1 << COUNT_BITS;
private static final int SHUTDOWN   =  0 << COUNT_BITS;
private static final int STOP       =  1 << COUNT_BITS;
private static final int TIDYING    =  2 << COUNT_BITS;
private static final int TERMINATED =  3 << COUNT_BITS;

其中,COUNT_BITS 是一个常量,表示状态码的位数。状态的转换如下:
file

  • RUNNING 转 SHUTDOWN:调用 shutdown() 方法。
  • (RUNNING 或 SHUTDOWN) 转 STOP:调用 shutdownNow() 方法。
  • (SHUTDOWN 或 STOP) 转 TIDYING:在对应状态下,任务数为 0 且执行中任务为空。
  • TIDYING 转 TERMINATED:在 TIDYING 状态执行完 terminated() 方法。

3. 源码解析及示例代码

下面是对源码解析及示例代码的详细讲解:

// ThreadPoolExecutor 源码省略...

// 示例代码
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolStateExample {
    public static void main(String[] args) {
        // 创建一个线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                5,  // 核心线程数
                10, // 最大线程数
                1,  // 线程空闲时间
                TimeUnit.SECONDS,  // 时间单位
                new LinkedBlockingQueue<>());  // 阻塞队列

        // 获取线程池状态
        int state = threadPool.getRunState();

        // 输出线程池状态
        switch (state) {
            case RUNNING:
                System.out.println("线程池处于 RUNNING 状态");
                break;
            case SHUTDOWN:
                System.out.println("线程池处于 SHUTDOWN 状态");
                break;
            case STOP:
                System.out.println("线程池处于 STOP 状态");
                break;
            case TIDYING:
                System.out.println("线程池处于 TIDYING 状态");
                break;
            case TERMINATED:
                System.out.println("线程池处于 TERMINATED 状态");
                break;
            default:
                System.out.println("未知状态");
        }
    }
}

在上述示例代码中,我们创建了一个线程池,并获取了其当前状态。根据状态码的不同,输出相应的状态信息。这有助于初学者理解线程池状态的概念及其在实际应用中的变化过程。

4. 总结

通过本教程的详细解析,我们深入了解了线程池的不同状态及其状态转换过程。这对于理解线程池的工作原理以及在实际应用中如何管理线程池都提供了有益的信息。希望这些知识能够帮助初学者更好地掌握 Java 线程池的核心概念。

正文到此结束
本文目录