Java-线程的生命周期&7大状态

在 Java 中,线程的生命周期可以分为多个状态,这些状态描述了线程从创建到终止的整个过程。Java 线程的生命周期主要包括以下七大状态:

1.新建状态(New)

当一个线程对象被创建但尚未调用 start() 方法时,线程处于新建状态。此时,线程还没有开始执行。

2.可运行状态(Ready)

当调用 start() 方法后,线程进入可运行状态。在这个状态下,线程可能正在运行,也可能在等待操作系统分配 CPU 时间片。

3.运行状态(Running)

当线程获得 CPU 时间片并开始执行时,线程进入运行状态。在这个状态下,线程正在执行其任务。

4.阻塞状态(Blocked)

当线程由于某些原因(如等待 I/O 操作完成、等待获取锁等)暂时无法继续执行时,线程进入阻塞状态。在这个状态下,线程不会占用 CPU 资源。

5.等待状态(Waiting)

当线程调用 Object.wait()Thread.join()LockSupport.park() 等方法时,线程进入等待状态。在这个状态下,线程等待其他线程显式地唤醒。

6.计时等待状态(Timed Waiting)

当线程调用带有超时参数的方法(如 Thread.sleep(long)Object.wait(long)Thread.join(long)LockSupport.parkNanos(long))时,线程进入计时等待状态。在这个状态下,线程等待一段时间后自动恢复。

7.终止状态(Terminated)

当线程完成其任务或因异常而终止时,线程进入终止状态。在这个状态下,线程不再执行,并且无法再次启动。

Runnable 状态的细分

在 Java 官方文档中,实际上是6个状态,Runnable 状态实际上包含了两个子状态:

  • 就绪状态(Ready):线程已经准备好运行,等待操作系统调度。
  • 运行状态(Running):线程正在执行其任务,占用 CPU 时间片。

区别

  1. 就绪状态(Ready)

    • 线程已经调用了 start() 方法,但尚未获得 CPU 时间片。
    • 线程在就绪队列中等待操作系统调度。
    • 线程在就绪状态下不会执行任何代码。
  2. 运行状态(Running)

    • 线程获得了 CPU 时间片,正在执行其任务。
    • 线程在运行状态下会执行其 run() 方法中的代码。
    • 线程在运行状态下可能会因为时间片用完而被操作系统暂停,重新回到就绪状态
java 复制代码
public class ThreadLifecycleExample {
    public static void main(String[] args) {
        // 新建状态
        Thread thread = new Thread(() -> {
            System.out.println("线程正在运行...");
            try {
                // 计时等待状态
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程运行结束。");
        });

        // 可运行状态
        thread.start();

        // 主线程等待子线程完成
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 终止状态
        System.out.println("子线程已终止。");
    }
}

注意事项

  • 线程调度:操作系统负责线程的调度,具体何时从就绪状态切换到运行状态由操作系统决定。
  • 状态转换:线程在运行过程中可能会在就绪状态和运行状态之间多次切换,这取决于操作系统的调度策略和线程的优先级。
  • 并发性:多个线程可能在同一时间处于就绪状态,等待操作系统调度执行。
  • 性能考虑:在设计多线程程序时,需要考虑线程的状态转换对性能的影响,避免频繁的状态切换和线程阻塞。
相关推荐
学到头秃的suhian5 小时前
Maven
java·maven
QX_hao5 小时前
【Go】--反射(reflect)的使用
开发语言·后端·golang
小坏讲微服务5 小时前
Docker-compose 搭建Maven私服部署
java·spring boot·后端·docker·微服务·容器·maven
chxii5 小时前
Maven 详解(下)
java·maven
inferno5 小时前
Maven基础(二)
java·开发语言·maven
杨武博5 小时前
关于maven中pom依赖冲突问题记录
java·maven
我是李武涯5 小时前
从`std::mutex`到`std::lock_guard`与`std::unique_lock`的演进之路
开发语言·c++
史不了6 小时前
静态交叉编译rust程序
开发语言·后端·rust
陈果然DeepVersion6 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(十)
java·spring boot·ai·kafka·面试题·向量数据库·rag
读研的武7 小时前
DashGo零基础入门 纯Python的管理系统搭建
开发语言·python