JavaEE初阶--线程状态

目录

一.引言

二.线程的状态

2.1  观察线程的所有状态

2.2  线程几种状态的介绍

2.3  线程状态之间的转换 

2.4  BLOCKED,WAITING,TIMED_WAITING的转换

三.总结


一.引言

  本篇文章将继续介绍多线程,这次为大家介绍多线程的状态。什么是状态?简单而言就是当前所处的情况,如“还没开始执行”“执行中”“阻塞等待等。这些就是状态!

二.线程的状态

2.1  观察线程的所有状态

  线程的状态是一个枚举类型Thread.State

public class ThreadState {
     public static void main(String[] args) {
         for (Thread.State state : Thread.State.values()) {
             System.out.println(state);
         }
     }
}

关于状态的查看State()可以观看我的上一篇博客:JavaEE初阶--多线程Thread基本用法-CSDN博客

2.2  线程几种状态的介绍

1.NEW:安排了工作,还没开始行动。

2.RUNNABLE:可工作的,又可以分成正在工作中和即将开始工作。

3.BLOCKED:表示排队等着其他事情。

4.WAITING:表示排队等着其他事情。

5.TIMED_WAITING:表示排队等着其他事情。

3个都是表示等着其他事情,之后我们会为大家介绍其中的区别。

在Java中,BLOCKED、WAITING和TIMED_WAITING都是线程状态。它们之间的区别如下:

  1. BLOCKED状态表示线程正在等待一个监视器锁(synchronized关键字)以进入一个同步块。例如,线程A已经获得了一个对象锁,但线程B尝试访问同一个同步块,那么线程B就会进入BLOCKED状态,直到线程A退出同步块为止。

  2. WAITING状态表示线程正在等待另一个线程执行特定操作。例如,调用了Object.wait()方法或Thread.join()方法时,线程就会进入WAITING状态。在WAITING状态下的线程需要其他线程执行特定的操作来唤醒它。

  3. TIMED_WAITING状态与WAITING状态类似,但它有一个超时时间。例如,调用了Thread.sleep()方法或Object.wait(long timeout)方法时,线程就会进入TIMED_WAITING状态。在超时时间到达之前,该线程会一直保持这种状态。

结论 :BLOCKED表示等待获取锁,WAITING和TIMED_WAITING表示等待其他线程发来通知。

TIMED_WAITING表示在等待唤醒,但设置了时限,WAITING线程在无线等待唤醒。 

2.3  线程状态之间的转换 

public class Demo4 {
    public static void main(String[] args) {
        Thread t1=new Thread(()->{
            for (int i = 0; i < 3; i++) {
            }
        },"李四");

        System.out.println(t1.getName()+":"+t1.getState());
        t1.start();
        while(t1.isAlive()){
            System.out.println(t1.getName()+":"+t1.getState());
        }
        System.out.println(t1.getName()+":"+t1.getState());
    }
}

2.4  BLOCKED,WAITING,TIMED_WAITING的转换

public class Demo5 {
    public static void main(String[] args) {
        final Object object=new Object();

        Thread t1=new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object){
                    while(true){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        },"t1");
        t1.start();
        Thread t2=new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object){
                    System.out.println("haha");
                }
            }
        },"t2");
        t2.start();
    }
}

状态结果可以在jconsole中找到:

 

三.总结

  本篇文章简单地为大家介绍了一下线程的状态以及状态的相互转换,欢迎各位在评论区留下你的看法。感谢观看!

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值