【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();
    }

在这里插入图片描述

🍐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());
    }

在这里插入图片描述

🍐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);
    }

在这里插入图片描述

🍐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 线程在⽆限等待唤醒

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!💞💞💞

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱吃南瓜的北瓜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值