JVM线程状态

在jvm中一共定义了6种线程状态,分别是:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。在Thread类中体现为下面的代码:

public static enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;

    private State() {
    }
}

jdk中对各种状态的描述如下:

NEW:尚未启动的线程处于此状态。

RUNNABLE:可运行线程的线程状态。 可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统(例如处理器)的其他资源

BLOCKED:一个线程的线程状态阻塞等待监视器锁定。 处于阻塞状态的线程正在等待监视器锁定进入同步块/方法,或者在调用Object.wait后重新输入同步的块/方法

WAITING:等待线程的线程状态 由于调用以下方法之一,线程处于等待状态

                      Object.wait没有超时

                     Thread.join没有超时

                      LockSupport.park 

TIMED_WAITING:具有指定等待时间的等待线程的线程状态。 线程处于定时等待状态,因为在指定的正等待时间内调用以下方法之一

                     Thread.sleep

                     Object.wait与超时

                     Thread.join与超时

                     LockSupport.parkNanos

                     LockSupport.parkUntil

 TERMINATED:终止线程的线程状态。 线程已完成执行。

一个线程可以在给定时间点处于一个状态。这些状态是不反映任何操作系统线程状态的虚拟机状态。

可以通过Thread.getState()获取线程状态(java5开始)

下面通过代码说明其中的四种状态,其余两种后续再更新:

新建线程类,这里是通过集成Thread类的方式:

public class MyThread extends Thread {
    public MyThread(String name) {
        this.setName(name);
    }

    @Override
    public void run() {
        super.run();
        for (int i = 0; i < 10; i++) {
            System.out.println(this.getName() + "   " + i);
            if (i == 5) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class ThreadState {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread("nhl");
        System.out.println(myThread.getState().name());// 新建状态,还未调用start方法,状态为  NEW
        myThread.start();
        System.out.println(myThread.getState().name());// 调用start方法后,线程处于RUNNABLE状态
        Thread.sleep(2000);
        System.out.println(myThread.getState().name());// myThread线程调用sleep方法后,处于TIMED_WAITING状态
        Thread.sleep(5000);
        System.out.println(myThread.getState().name());// myThread线程执行完成后,处于TERMINATED状态
    }
}

执行结果如下:

------------------------------------------------------------------------------------------------------------------------------------------------------

下面演示BLOCKED状态:

修改代码:

测试代码:

第一次打印BLOCKED是在主线程中获取myThread的状态

第二次打印RUNNABLE是在myThread线程中获取自己的状态

这里关键要理解:Thread.currentThread()代表的是什么。WAITING状态下次再更新

 

--------------------------------------------------------------------------------------------------------------------------------------------

下面演示WAITING状态:

 

测试类:

至此,JVM中定义的线程状态就演示完毕啦,如果有什么问题,欢迎伙伴们指正

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值