Java线程状态
在 Java 中,线程有多种状态,并且 Java 提供了 Thread.State
枚举类来表示这些状态。下面为你详细介绍线程的状态以及这个枚举类。
线程的状态
Java 中线程的状态由 Thread.State
枚举类定义,总共有 6 种状态:
- NEW(新建):线程对象已经创建,但还没有调用
start()
方法。 - RUNNABLE(可运行):线程已经调用了
start()
方法,正在 Java 虚拟机中执行,但可能正在等待操作系统的其他资源(如 CPU)。此状态包含了传统意义上的“就绪”和“运行”两种状态。 - BLOCKED(阻塞):线程在等待获取一个排他锁,这个锁被其他线程持有,导致该线程暂时无法继续执行。
- WAITING(等待):线程正在等待另一个线程执行特定的操作。例如,调用了
Object.wait()
、Thread.join()
或LockSupport.park()
方法。处于这种状态的线程不会被分配 CPU 时间片,需要其他线程唤醒。 - TIMED_WAITING(计时等待):和
WAITING
状态类似,不过它有一个指定的等待时间。例如,调用了Thread.sleep(long millis)
、Object.wait(long timeout)
、Thread.join(long millis)
或LockSupport.parkNanos()
、LockSupport.parkUntil()
方法。 - TERMINATED(终止):线程的执行已经结束,可能是正常结束,也可能是因为抛出了未捕获的异常而终止。
Thread.State
枚举类代码示例
下面是一个简单的 Java 代码示例,展示了如何使用 Thread.State
枚举类来获取线程的状态:
public class ThreadStateExample { public static void main(String[] args) { // 创建一个新线程 Thread thread = new Thread(() -> { try { // 线程休眠 2 秒 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }); // 获取线程初始状态(NEW) Thread.State state = thread.getState(); System.out.println("线程初始状态: " + state); // 启动线程 thread.start(); // 获取线程启动后的状态(RUNNABLE 或 TIMED_WAITING) state = thread.getState(); System.out.println("线程启动后的状态: " + state); try { // 等待线程执行完毕 thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } // 获取线程终止后的状态(TERMINATED) state = thread.getState(); System.out.println("线程终止后的状态: " + state); } }
代码解释
- 在代码中,首先创建了一个新线程
thread
,此时线程处于NEW
状态。 - 调用
start()
方法启动线程后,线程进入RUNNABLE
状态,由于线程中调用了Thread.sleep(2000)
方法,所以它会进入TIMED_WAITING
状态。 - 最后,使用
join()
方法等待线程执行完毕,线程执行结束后进入TERMINATED
状态。
通过这个示例,你可以清晰地看到线程在不同阶段的状态变化,以及如何使用 Thread.State
枚举类来获取线程的状态。
JUC编程 文章被收录于专栏
JUC 是 Java.util.concurrent 包的简称,它是 Java 5 引入的一个用于处理并发编程的工具包,为 Java 开发者提供了一系列用于高效处理并发任务的类和接口,极大地简化了多线程编程的复杂性。