【Java】线程的状态

这篇具有很好参考价值的文章主要介绍了【Java】线程的状态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Java】线程的状态,java
在之前的文章中,已经介绍了关于线程的基础知识。

我的主页: 🍆🍆🍆爱吃南瓜的北瓜

✍绪论

线程主要包括如下六种状态

【Java】线程的状态,java

在任意一个时间点,一个线程只能有且只有其中的一种状态,这6种状态分别如下:

  • NEW: 安排了⼯作, 还未开始⾏动

创建后尚未启动的线程处于这种状态

  • RUNNABLE: 可⼯作的. ⼜可以分成正在⼯作中和即将开始⼯作.

调用start()方法,RUNNABLE包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间(该线程已经获取了除CPU资源外的其他资源,等待获取CPU 资源后才会真正处于运行状态)。

  • BLOCKED: 这⼏个都表⽰排队等着其他事情

线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等待着获取到一个排他锁,这个事件将在另外一个线程获得锁的时候可能发生,比如synchronized之外;而“等待状态”则是在获得锁之后,主动释放锁,进入等待一段时间,或者等待唤醒动作的发生。

  • WAITING: 这⼏个都表⽰排队等着其他事情

处于这种状态的线程不会被分配CPU执行时间,它们要等待被其他线程显式地唤醒。以下方法会让线程陷入无限期的等待状态:

  • TIMED_WAITING: 这⼏个都表⽰排队等着其他事情

处于这种状态的线程也不会被分配CPU执行时间,不过无须等待被其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程进入限期等待状态:

  • TERMINATED: ⼯作完成了.

已终止线程的线程状态,线程已经结束执行。

🍐1.NEW

创建了线程t 但是还未start,获取线程状态
就是NEW

  public static void main(String[] args) {
        Thread t = new Thread(()->{
            System.out.println("hello ");
        });
        System.out.println(t.getState());

        t.start();
    }

【Java】线程的状态,java

🍐2.TERMINATED

表示线程已经终止了
内核中线程已经销毁了

 public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            System.out.println("hello ");
        });
        System.out.println(t.getState());

        t.start();
        t.join();
        //加入join()是为了确保t执行完毕,获取t的状态
        System.out.println(t.getState());
    }

【Java】线程的状态,java

🍐3.RUNNABLE

就绪状态
有两种可能

  1. 这个线程正在CPU上执行
  2. 这个线程虽然不在CPU上执行,但是随时可以调度到CPU上执行。

这两种情况,没必要分清楚到底是那种情况。

--------------------

WAITING,TIMED_WAITING,BLOCKED
这三种都是阻塞
不过产生阻塞的原因不同

🍐4.WAITING

死等进入阻塞

🍐5.TIMED_WAITING

带有超时时间的阻塞

public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
          while (true){
              System.out.println("hello thread");
              try {
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
                  throw new RuntimeException(e);
              }
          }
        });

        thread.start();


        thread.join();

        //thread.join(60000);
    }

【Java】线程的状态,java

🍐6.BLOCKED

带有锁竞争的阻塞

  public static void main(String[] args) {
        Object locker = new Object();
        Thread t1 = new Thread(()->{
            synchronized (locker){
                System.out.println("t1线程开始");
                try {
                     Thread.sleep(1000);

                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("t1线程结束");
            }
        });
        Thread t2 = new Thread(()->{
            synchronized (locker){
                System.out.println("t2线程开始");
                
                System.out.println("t2线程结束");
            }
        });

        t1.start();
        t2.start();
    }

使⽤ jconsole 可以看到 t1 的状态是 TIMED_WAITING , t2 的状态是 BLOCKED

修改代码,将t1中的sleep换成wait

 public static void main(String[] args) {
        Object locker = new Object();
        Thread t1 = new Thread(()->{
            synchronized (locker){
                System.out.println("t1线程开始");
                try {
                    locker.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("t1线程结束");
            }
        });
        Thread t2 = new Thread(()->{
            synchronized (locker){
                System.out.println("t2线程开始");

                System.out.println("t2线程结束");
            }
        });

        t1.start();
        t2.start();
    }

使⽤ jconsole 可以看到 t1 的状态是 WAITING

结论

  • BLOCKED 表⽰等待获取锁, WAITING 和 TIMED_WAITING 表⽰等待其他线程发来通知.
  • TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在⽆限等待唤醒

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!💞💞💞文章来源地址https://www.toymoban.com/news/detail-851296.html

到了这里,关于【Java】线程的状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java多线程【状态与安全问题】

    线程状态 说明 NEW 安排了工作, 还未开始行动 RUNNABLE 可工作的. 又可以分成正在工作中和即将开始工作 BLOCKED 这几个都表示排队等着其他事情 WAITING 这几个都表示排队等着其他事情 TIMED_WAITING 这几个都表示排队等着其他事情 TERMINATED 工作完成了 1.NEW状态:安排了工作, 还未开始

    2023年04月09日
    浏览(51)
  • 【面试精讲】Java线程6种状态和工作原理详解,Java创建线程的4种方式

    Java线程6种状态和工作原理详解,Java创建线程的4种方式 一、Java线程的六种状态 二、Java线程是如何工作的? 三、BLOCKED 和 WAITING 的区别 四、start() 和 run() 源码分析 五、Java创建线程的所有方式和代码详解 1. 继承Thread类 2. 实现Runnable接口 3. 实现Callable接口与FutureTask 4. 使用线

    2024年03月13日
    浏览(51)
  • 【Java-10】深入浅出线程安全、死锁、状态、通讯、线程池

    线程安全 线程死锁 线程的状态 线程间通讯 线程池 1.1 线程安全产生的原因 多个线程在对共享数据进行读改写的时候,可能导致的数据错乱就是线程的安全问题了 问题出现的原因 : 多个线程在对共享数据进行读改写的时候,可能导致的数据错乱就是线程的安全问题了 1.2 线程

    2024年02月11日
    浏览(72)
  • Java多线程(1)---多线程认识、四种创建方式以及线程状态

    目录 前言 一.Java的多线程 1.1多线程的认识  1.2Java多线程的创建方式 1.3Java多线程的生命周期 1.4Java多线程的执行机制 二.创建多线程的四种方式 2.1继承Thread类 ⭐创建线程  ⭐Thread的构造方法和常见属性  2.2.实现Runnable接口 ⭐创建线程 ⭐使用lambda表达式创建 2.3实现Callable接口

    2024年02月14日
    浏览(43)
  • 【Java多线程】线程中几个常见的属性以及状态

    目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活   ID 是线程的唯一标识,由系统自动分配,不同线程不会重复。 用户定义的名称。该名称在各种调试工具中都会用到。 状态表示线程当前所处的一个情况。和进程一样,线程

    2024年02月19日
    浏览(44)
  • 六种Java线程状态及jstack命令详解

    新建状态(New) :当创建一个Thread实例后,线程就处于新建状态。此时线程对象已经被分配了内存,并初始化了其成员变量的值。 就绪状态(Runnable) :也被称为“可执行状态”。当调用了线程的start()方法后,线程就进入了就绪状态。此时线程已经具备了执行的条件,等待

    2024年03月18日
    浏览(43)
  • 【Java】线程都有哪几种状态

    首先我们要知道,在传统(操作系统)的线程模型中线程被分为五种状态,在java线程中,线程被分为六种状态。 线程的五种状态: 新建(new) 创建了一个新的线程对象 就绪(runnable) 调用线程的start()方法,处于就绪状态 运行(running) 获得了CPU时间片,执行程序代码 就绪

    2024年02月09日
    浏览(58)
  • 【Java EE初阶三 】线程的状态与安全(下)

             线程安全 : 某个代码,不管它是单个线程执行,还是多个线程执行,都不会产生bug,这个情况就成为“线程安全”。          线程不安全 : 某个代码,它单个线程执行,不会产生bug,但是多个线程执行,就会产生bug,这个情况就成为 “线程不安全”,或者

    2024年02月03日
    浏览(45)
  • 【Java练习题汇总】《第一行代码JAVA》多线程篇,汇总Java练习题——线程及多线程概念、Thread 类及 Runnable 接口、线程状态、synchronized同步操作...

    一、填空题 Java 多线程可以依靠________ 、________ 和________ 三种方式实现。 多个线程操作同一资源的时候需要注意________,依靠________ 实现,实现手段是:________ 和________,过多的使用,则会出现________ 问题。 Java 程序运行时,至少启动________ 个线程,分别是________ 和_

    2024年02月16日
    浏览(58)
  • 面试官:Java 线程有哪几种状态?它们之间是怎么切换的?

    来源:https://blog.csdn.net/limenghua9112/article/details/106975105 线程是 JVM 执行任务的最小单元,理解线程的状态转换是理解后续多线程问题的基础。 在 JVM 运行中,线程一共有 NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED 六种状态,这些状态对应 Thread.State 枚举类中的状态。 推荐

    2024年02月12日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包