线程的状态

✨个人主页: 不漫游-CSDN博客

前言

之前在讲进程的时候提到进程有就绪和阻塞状态--->http://t.csdnimg.cn/p2cd0

接下来咱们就细究线程的状态~

6种状态

NEW

线程刚被创建,但尚未启动。即线程对象已经实例化,但还没有调用 ​start()​ 方法。

TERMINATED

线程已经完成执行。尽管Thread对象还在,但线程已经结束了。

RUNNABLE

和进程中的就绪状态一样,线程此时在CPU上运行或者随时都可以去CPU上运行。

WAITING

线程在等待另一个线程执行特定的动作。

例如通过调用 ​Object.wait()​、​Thread.join()​ 。没有参数就要被等的线程执行结束才行。不然就一直阻塞等待。

TIMED_WAITING

线程在等待另一个线程执行特定的动作,但有一个超时时间。

例如,通过调用 ​Thread.sleep(long)​、​Object.wait(long)​、​Thread.join(long)​​。有参数的就不会死等了。


BLOCKED

因为线程 对于 锁 的竞争引起的堵塞。

获取状态

对于以上的状态的获取,可以调用Thread 类中的​ getState() 方法去获取。如图~​

public class demo14 {
    public static void main(String[] args) {
             //创建一个线程
        Thread thread = new Thread(() -> {
            try {
                //让线程休眠一段时间
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println("线程状态: " + thread.getState());
        //启动线程
        thread.start();

        //打印线程的状态
        System.out.println("线程状态: " + thread.getState());

        try {
            //主线程休眠一段时间,以便观察线程状态的变化
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //再次打印线程的状态
        System.out.println("线程状态: " + thread.getState());

        try {
            //等待线程结束
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //再次打印线程的状态
        System.out.println("线程状态: " + thread.getState());
    }
}

创建了Thread对象但没start(),所以是NEW.

一旦开始start,便是RUNNABLE .

而后调用sleep 去休眠,有参数的就是规定了等待时间的,便是TIMED_WAITTING.

最后进程结束,也对着TERMINATED.

当然也可以通过jconsole来查看 Java程序的详细信息。

可以从命令行(直接输入jconsole)或在 jdk文件包中bin目录中找到并运行。

状态之间的转换


NEW → RUNNABLE

当调用 ​start()​ 方法时,很明显,线程从 NEW 状态转换到 RUNNABLE 状态。


RUNNABLE → BLOCKED

当线程试图进入一个被其他线程占用的同步块(上锁)时,它会从 RUNNABLE 状态转换到 BLOCKED 状态。(后续重点讲这个~)


RUNNABLE → WAITING

当线程调用 ​Object.wait()​、​Thread.join()​ 时,它会从 RUNNABLE 状态转换到 WAITING 状态。


RUNNABLE → TIMED_WAITING

当线程调用 ​Thread.sleep(long)​、​Object.wait(long)​、​Thread.join(long)​ 时,它会从 RUNNABLE 状态转换到 TIMED_WAITING 状态。


BLOCKED/WAITING/TIMED_WAITING → RUNNABLE

当线程获取到对应的锁、被其他线程通知或超时时间到达时,它会从 BLOCKED、WAITING 或 TIMED_WAITING 状态转换到 RUNNABLE 状态。


RUNNABLE → TERMINATED

当线程的 ​run()​ 方法正常结束即线程结束时,它会从 RUNNABLE 状态转换到 TERMINATED 状态。

符合各种状态的特点就好确定转换条件啦~

看到最后,如果觉得文章写得还不错,希望可以给我点个小小的赞,您的支持是我更新的最大动力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值