Java线程的五种状态详解及状态转换规则

2024年 2月 19日 52.9k 0

深入了解java线程的五种状态及其转换规则

深入了解Java线程的五种状态及其转换规则

一、线程的五种状态介绍在Java中,线程的生命周期可以分为五个不同的状态,包括新建状态(NEW)、就绪状态(RUNNABLE)、运行状态(RUNNING)、阻塞状态(BLOCKED)和终止状态(TERMINATED)。

  • 新建状态(NEW):当线程对象创建后,它就处于新建状态。此时,线程对象已经分配了足够的资源来执行任务,但是还没有开始执行run()方法。
  • 就绪状态(RUNNABLE):当线程调用了start()方法之后,线程会进入就绪状态。处于就绪状态的线程已经具备了运行的条件,等待CPU分配时间片段来执行代码。
  • 运行状态(RUNNING):当就绪状态的线程获取到CPU时间片段后,进入运行状态,并开始执行run()方法中的代码。线程将一直保持运行状态,直到自行结束或被其他线程中断。
  • 阻塞状态(BLOCKED):在以下情况下,线程会进入阻塞状态:

    • 调用了sleep()方法,主动让出了CPU资源。
    • 等待某个资源的释放,如锁资源。
    • 线程在join()方法中等待其他线程的结束。
  • 终止状态(TERMINATED):线程结束后,就进入了终止状态。线程完成run()方法中的代码执行后,或者因为异常等原因导致线程中止,都会使线程进入终止状态。
  • 二、状态之间的转换规则线程的状态之间存在一定的转换规则,下面我们分别介绍每种状态之间的转换规则。

  • 新建状态(NEW)转换为就绪状态(RUNNABLE):当线程对象创建后,调用了start()方法,线程就由新建状态转换为就绪状态。
  • 就绪状态(RUNNABLE)转换为运行状态(RUNNING):当线程获取到CPU资源后,就从就绪状态转换为运行状态。
  • 运行状态(RUNNING)转换为阻塞状态(BLOCKED):线程在执行过程中,可能会由于等待某个资源的释放或者主动释放CPU资源,而进入阻塞状态。
  • 阻塞状态(BLOCKED)转换为就绪状态(RUNNABLE):当线程等待的资源被释放后,或者等待时间到达,就会从阻塞状态转换为就绪状态。
  • 运行状态(RUNNING)转换为终止状态(TERMINATED):当线程的run()方法执行完成或者因为异常而导致线程中止时,线程会从运行状态转换为终止状态。
  • 三、代码示例

    下面是一个简单的代码示例,展示了线程状态之间的转换规则:

    class MyThread extends Thread {

    @Override
    public void run() {
    try {
    Thread.sleep(1000);
    System.out.println("线程执行完毕");
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }

    public class ThreadStateDemo {

    public static void main(String[] args) {
    MyThread thread = new MyThread();
    System.out.println("线程创建后状态:" + thread.getState());

    thread.start();
    System.out.println("调用start()方法后状态:" + thread.getState());

    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("等待500ms后状态:" + thread.getState());

    try {
    thread.join();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("调用join()方法后状态:" + thread.getState());
    }
    }

    登录后复制

    运行以上代码,可以看到输出结果如下:

    线程创建后状态:NEW
    调用start()方法后状态:RUNNABLE
    等待500ms后状态:RUNNABLE
    线程执行完毕
    调用join()方法后状态:TERMINATED

    登录后复制

    以上代码创建了一个继承自Thread类的线程对象MyThread。在主线程中,我们可以观察到线程对象在不同阶段的状态变化。

    通过深入了解Java线程的五种状态及其转换规则,我们能够更好地掌握多线程的原理,进一步提升并发编程的能力。同时,在实际开发过程中,对线程状态的判断和处理也是非常重要的。希望本文能对大家有所帮助。

    以上就是Java线程的五种状态详解及状态转换规则的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论