Java线程状态总结

目录

一.初始Java线程的所有状态

1.输出所有状态名

2.所有状态解释

3.线程的状态和转移图解

二.通过Java程序观察线程状态

1.isAlive()观察线程NEW,RUNNABLE,TERMINATED状态

2.使用jre中的jconsole来观察线程状态

 3.观察WAITING,BLOCKED,TIMED_WAITING状态

(1)WAITING状态下代码逻辑 

 (2)线程WAITING状态

(3) TIMED_WAITING和BOLCKED状态下的代码逻辑

 (4) TIMED_WAITING和BOLCKED状态

 (5)代码

(6)三种状态解释说明


一.初始Java线程的所有状态

1.输出所有状态名

由于线程的抢占式执行,所以线程就存在了不同的状态,在Java中有个枚举类型的类,存在所有线程状态的名称;如下所示:

 

2.所有状态解释

  • NEW: 安排了工作, 还未开始行动(初始化)
  • RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作(就绪/运行)
  • BLOCKED: 这几个都表示排队等着其他事情(阻塞)
  • WAITING: 这几个都表示排队等着其他事情(阻塞)
  • TIMED_WAITING: 这几个都表示排队等着其他事情(阻塞)
  • TERMINATED: 工作完成了(结束)

 

3.线程的状态和转移图解

 

 

二.通过Java程序观察线程状态

1.isAlive()观察线程NEW,RUNNABLE,TERMINATED状态

注意:除了NEW和TERMINATED状态外,其他状态线程都处于存活状态

代码:

public class StatusName {
    public static void main(String[] args) {
       Thread thread = new Thread(()->{
           for (int i = 0; i < 10_0000; i++) {

           }     
       },"线程1");
        System.out.println(thread.getName()+": "+thread.getState());
        thread.start();
        while (thread.isAlive()) {
            //thread线程存活,就执行下面代码
            System.out.println(thread.getName()+": "+thread.getState());
        }
        System.out.println(thread.getName()+": "+thread.getState());
    }
}

 

2.使用jre中的jconsole来观察线程状态

运行程序后(前提是程序不能一瞬间就运行完,这样就观察不到需要观察线程的状态),在idea中点击terminal并在控制台输入jconsole就可以进行连接,如下图所示:

 

 进入后以不安全状态连接

 

 

 3.观察WAITING,BLOCKED,TIMED_WAITING状态

(1)WAITING状态下代码逻辑 

 

 (2)线程WAITING状态

 

(3) TIMED_WAITING和BOLCKED状态下的代码逻辑

 

 (4) TIMED_WAITING和BOLCKED状态

 

 (5)代码

public class StatusName {
    static Object locker = new Object();
    public static void main(String[] args) throws InterruptedException {
       Thread thread1 = new Thread(()->{
           synchronized (locker) {
               while (true) {
                   try {
                       //waiting状态
//                       locker.wait();
                       //timed_wating状态
                       Thread.sleep(100);
                   } catch (Exception e) {
                       e.printStackTrace();
                   }
               }
           }
       },"线程1");
       thread1.start();
       Thread.sleep(3000);
       Thread thread2 = new Thread(()->{
           synchronized (locker) {
               System.out.println("thread2");
           }
       },"线程2");
       thread2.start();
    }
}

 

(6)三种状态解释说明

BLOCKED :等待获取锁

WAITING 和 TIMED_WAITING :等待其他线程发来通知

TIMED_WAITING: 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒
 

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值