【Java】线程的状态及维护方式

线程状态

Java中的线程状态说的是Thread对象的状态,有自己的生命周期,并不是PCB的状态。

1.NEW:创建一个Java线程(对象),但还没调用start()方法,也就是还没参与CPU调度,此时就是一个Java对象;
2.RUNNABLE:运行或在就绪队列中(PCB的就绪队列);
3.TERMINATED:线程执行完成,PCB在操作系统中已经销毁,但是Java对象还在;
4.TIMED_WATING:等待一段时间(有时间限制的等待,过时不候);
4.WATING:没有时间限制的等待,死等;
5.BLOCK:等待锁的时候进入的阻塞状态。

在这里插入图片描述

public class Demo09_State {
    public static void main(String[] args) throws InterruptedException {
        // 创建线程
        Thread t1 = new Thread(() -> {
            // 第二种情况
//            for (int i = 0; i < 1000_0000_00; i++) {
                // 啥也不干,等着让他结束
//            }
            // 第一种情况
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程结束");
        });
        // 启动之前打印一下线程状态
        // 当前只是new 出来了一个Thread类的对象
        System.out.println("启动之前的状态:" + t1.getState());
        // 真正启动线程
        t1.start();
        // 等待一会,让系统去创建PCB
        Thread.sleep(1000);
        System.out.println("启动之后的状态:" + t1.getState());

        // 等待线程结束
        t1.join();
        System.out.println("PCB是否存活:" + t1.isAlive());
        System.out.println("线程执行完成后的状态:" + t1.getState());
    }
}

在这里插入图片描述
当线程只执行简单的循环任务,同时也没有等待时,线程在启动之后的状态是Runnable,这也是大多数时候线程所处的状态。

public class Demo09_State {
    public static void main(String[] args) throws InterruptedException {
        // 创建线程
        Thread t1 = new Thread(() -> {
            // 第二种情况
            for (int i = 0; i < 1000_0000_00; i++) {
                // 啥也不干,等着让他结束
            }
            // 第一种情况
//            try {
//                Thread.sleep(3000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            System.out.println("线程结束");
        });
        // 启动之前打印一下线程状态
        // 当前只是new 出来了一个Thread类的对象
        System.out.println("启动之前的状态:" + t1.getState());
        // 真正启动线程
        t1.start();
        // 等待一会,让系统去创建PCB
//        Thread.sleep(1000);
        System.out.println("启动之后的状态:" + t1.getState());

        // 等待线程结束
        t1.join();
        System.out.println("PCB是否存活:" + t1.isAlive());
        System.out.println("线程执行完成后的状态:" + t1.getState());
    }
}

在这里插入图片描述

系统维护线程状态的方式

系统使用两个队列:就绪队列和阻塞队列来维护PCB的状态,PCB的线程改变之后,对应Java中Thread类的对象的状态就会发生改变。
在这里插入图片描述

使用工具查看线程及状态

使用JDK提供的工具查看线程及状态。在JDK的bin目录下,有一个可执行的应用程序jconsole.exe,可以查看当前的进程和状态。
在这里插入图片描述


继续加油~
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值