线程的状态 - Java

上面这张图是线程的几种状态情况,可能会看的有一些乱 , 所以我们将线程状态简化一下,得到下面这张图

线程的六大状态

NEW 状态

此时线程已经被创建(NEW) ,但还没有被调用的情况

Thread t = new Thread(() -> {

});
//没有启动
System.out.println(t.getState()); //NEW

此时线程的状态就是NEW.

RUNNABLE 状态

此时线程已经创建好(NEW), 并且已经启动, 此时线程正在快速执行任务(RUNNABLE), 并且还没有得到释放

//注意TERMINATED 和 NEW 是Java内部搞出来的 和PCB中的状态没有啥关系
Thread t3 = new Thread(() -> {
    while (true) {
        //程序快速执行
    }
});
t3.start();
Thread.sleep(1000);
//如果代码中没有进行Sleep 也没有进行其他的可能导致阻塞的操作,代码大概率是处在Runnable状态的,
//因为创建线程也需要时间,可能获取线程状态的是时候,线程并没有走到预期的位置.
System.out.println(t3.getState()); //RUNNABLE

TIMED_WAITING 状态

此时线程进入阻塞状态, 通常这种状态都是有等待时间的(TIMED_WAITING) 当线程执行完sleep操作之后, 如果该线程不再休眠, 那么就会进入RUNNABLE状态 , 直到线程执行完任务.

 Thread t4 = new Thread(() -> {
    while (true) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});
t4.start();
Thread.sleep(1000);
//join 也属于阻塞状态只是到了一定时间之后阻塞状态解除
System.out.println(t4.getState());// TIMED_WAITING

TERMINATED 结束态

当线程已经创建好(NEW),并且任务已经执行完毕(RANNABLE),但是并没有得到资源的释放(TEWMINATED).

Thread t2 = new Thread(() -> {

});
t2.start();
t2.sleep(1000);
//线程已经执行完毕 但是进程还没销毁 为了得到这个状态给sleep一秒的延迟让他仍然存在.
System.out.println(t2.getState());//TERMINATED

WAITING 阻塞态

该状态也是一种阻塞态 , 不过跟TIMED_WAITING不一样的是, 该阻塞没有时间限制 , 如果没有线程调用notify() 方法, 那么waiting状态的线程会一直阻塞下去

Thread t5 = new Thread(() -> {
    while (true) {
        synchronized (locker) {
            synchronized (locker2) {
                try {
                    locker.wait();
                    Thread.sleep(10_0000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
});
t5.start();
Thread.sleep(1000);
System.out.println(t5.getState());

但是注意: wait () 方法需要搭配锁来进行使用, 当线程被notify 唤醒之后, 就会进入RUNABLE状态 正常进行工作.

BLCOKED阻塞态

该状态说明线程正在进行抢锁操作, 因为唯一的一把锁已经被其他线程占用了,(也就是上述线程的t5 抢占了 locker2 锁, 因此 t6 进程正在不断地抢锁操作.) 从而进入阻塞态

Thread t5 = new Thread(() -> {
    while (true) {
        synchronized (locker) {
            synchronized (locker2) {
                try {
                    locker.wait();
                    Thread.sleep(10_0000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
});
t5.start();
Thread.sleep(1000);
//System.out.println(t5.getState());
Thread t6 = new Thread(() -> {
    synchronized (locker) {
        //抢到锁的t4 进入休眠, 不释放锁
        synchronized (locker2) {
            while (true) {

            }
        }
    }
});
t6.start();
Thread.sleep(1000);
System.out.println(t6.getState());
}

以上就是线程的六大状态, 如果感觉由帮助的话麻烦点赞收藏以下谢谢 🌹🌹🌹

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值