线程的状态

本文详细介绍了Java线程的五种基本状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED),以及它们之间的转换过程,以示例演示了线程状态在不同操作下的变化,特别关注了锁和等待通知的作用。

        线程的状态有哪些

        线程的状态是一个枚举类型 Thread.State,可以通过Thread.State.values()获取线程的状态集合

public static void main(String[] args) {
        //通过foreach遍历state的集合
        for(Thread.State state : Thread.State.values()){
            System.out.println(state);
        }
    }

        这些线程的状态的含义是什么?

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

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

        BLOCKED:因为锁竞争而进入的排队等待状态.

        WAITING:一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态.

        TIMED_WAITING:同WAITING但是指定一个时间参数,超时将结束该状态.

        TERMINATED: ⼯作完成了.

        线程的状态之间的转换

        1)观察 NEW  RUNNABLE  TERMINATED之间的转换

public static void main(String[] args) {
        //创建一个只执行将n递增到50的线程
        Thread t = new Thread(() -> {
            int n = 0;
            while(n <= 50){
                n++;
            }
        },"线程t");
        //打印线程的名字和状态
        System.out.println(t.getName()+" "+t.getState());
        // 开启线程
        t.start();
        //如果t线程仍然在工作 则打印名字和状态
        while(t.isAlive()){
            System.out.println(t.getName()+" "+t.getState());
        }
        //此时t线程工作结束
        System.out.println(t.getName()+" "+t.getState());
    }

从运行结果来看第一次打印的 NEW 为线程开始工作前所打印,此时没有调用start方法去内核中创建线程,之后打印的 RUNNABLE 为线程在执行时 while循环打印的内容,打印条件为 线程t在工作中,最后打印的 TERMINATED 为while循环结束后打印 此时t线程工作完毕 但是Thread对象t仍然存在,内核中不存在 线程t

        2) 观察 WAITING  BLOCKED  TIMED_WAITING之间的转换

public static void main(String[] args) {
        //创建一个锁对象
        Object lock = new Object();
        Thread t1 = new Thread(() -> {
            //使用锁对象上锁
            synchronized (lock){
                while(true){
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"t1");
        Thread t2 = new Thread(() -> {
            synchronized (lock){
                while(true){
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"t2");
        t1.start();
        t2.start();
    }

               使用jconsole 可以观察到

        

        t1由于sleep且有参数限制所以处于 TIMED_WAITING状态

        t2由于锁对象被t1上锁 所以t2处于BLOCKED状态

                如果将上述t1中的sleep改为 wait

//创建一个锁对象
        Object lock = new Object();
        Thread t1 = new Thread(() -> {
            //使用锁对象上锁
            synchronized (lock){
                while(true){
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"t1");
.......

        此时t1就会变为WAITING状态

        结论:

        BLOCKED 表⽰等待获取锁, WAITING 和 TIMED_WAITING 表⽰等待其他线程发来通知.

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值