Java线程状态

在 Java 中,线程有多种状态,并且 Java 提供了 Thread.State 枚举类来表示这些状态。下面为你详细介绍线程的状态以及这个枚举类。

线程的状态

Java 中线程的状态由 Thread.State 枚举类定义,总共有 6 种状态:

  1. NEW(新建):线程对象已经创建,但还没有调用 start() 方法。
  2. RUNNABLE(可运行):线程已经调用了 start() 方法,正在 Java 虚拟机中执行,但可能正在等待操作系统的其他资源(如 CPU)。此状态包含了传统意义上的“就绪”和“运行”两种状态。
  3. BLOCKED(阻塞):线程在等待获取一个排他锁,这个锁被其他线程持有,导致该线程暂时无法继续执行。
  4. WAITING(等待):线程正在等待另一个线程执行特定的操作。例如,调用了 Object.wait()Thread.join()LockSupport.park() 方法。处于这种状态的线程不会被分配 CPU 时间片,需要其他线程唤醒。
  5. TIMED_WAITING(计时等待):和 WAITING 状态类似,不过它有一个指定的等待时间。例如,调用了 Thread.sleep(long millis)Object.wait(long timeout)Thread.join(long millis)LockSupport.parkNanos()LockSupport.parkUntil() 方法。
  6. 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 开发者提供了一系列用于高效处理并发任务的类和接口,极大地简化了多线程编程的复杂性。

全部评论
点赞 回复 分享
发布于 03-29 13:36 北京

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务