线程的生命周期

Java 线程的生命周期主要包括五个阶段:新建、就绪、运行、阻塞和死亡(销毁)。

1.新建状态:创建一个新线程对象。

使用new关键字和Thread类或其子类创建一个线程对象后,该线程对象就处于新建状态,直到程序调用此线程对象.start()。

2.就绪状态:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待获取CPU的使用权。

3.运行状态:就绪状态的线程获取到CPU,执行run()方法

4.阻塞状态:线程因为某种原因放弃CPU使用权,暂时停止运行。可能被阻塞的情况有:等待I/O操作、等待获取同步锁、主动调用sleep()、join()或等待某个通知。

5.死亡状态:线程执行完毕或者因异常退出run()方法,死亡状态的线程不可再次启动。

线程生命周期示例代码

public class ThreadLifecycleExample {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                System.out.println("线程启动");
                try {
                    // 模拟阻塞状态
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 模拟等待状态
                synchronized (this) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("线程结束");
            }
        });
 
        System.out.println("线程创建");
        thread.start();
        System.out.println("线程就绪");
 
        // 等待线程结束
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程最终状态:死亡");
    }
}

线程的状态转换

线程状态的转换是由Java虚拟机中的线程调度器控制的。线程状态的转换条件如下:

新建状态 -> 就绪状态:调用start()方法

就绪状态 -> 运行状态:获取CPU时间片

运行状态 -> 就绪状态:调用yield()方法或者被其他高优先级线程抢占CPU时间片

运行状态 -> 阻塞状态:调用sleep()方法、wait()方法或者I/O操作等阻塞方法

阻塞状态 -> 就绪状态:等待资源释放或者等待时间到期

运行状态、阻塞状态 -> 终止状态:run()方法执行完毕或者调用stop()方法

线程状态转换示例:

public class ThreadLifecycleDemo {
  public static void main(String[] args) {
    Thread thread = new Thread(() -> {
      System.out.println("Thread is running...");
      try {
        Thread.sleep(5000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("Thread is terminating...");
    });

    System.out.println("Thread is in NEW state.");
    thread.start();
    System.out.println("Thread is in RUNNABLE state.");

    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    System.out.println("Thread is in BLOCKED state.");

    try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    System.out.println("Thread is in TERMINATED state.");
  }
}

在这个示例中,我们创建了一个新的线程并启动它。在线程启动之后,它将进入运行状态并输出一条消息。然后,我们让主线程休眠1秒钟,以模拟线程被阻塞的情况。在休眠期间,线程将进入阻塞状态。最后,线程将在5秒钟后完成其任务并进入终止状态。

运行上述代码,我们将会看到以下输出:

Thread is in NEW state.

Thread is in RUNNABLE state.

Thread is running...

Thread is in BLOCKED state.

Thread is terminating...

Thread is in TERMINATED state.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

题安题安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值