Java线程状态

6种线程状态

Java语言定义了6种线程状态,在任意一个时间点,一个线程只能有且只有其中的一种状态。

  • New(新建):创建后尚未启动的线程处于此状态。此时,JVM会为线程对象分配内存,初始化其成员变量。

  • Waiting(无限期等待):该线程无限期地等待另一个线程执行某个特定操作时。

  • Timed Waiting(限期等待):该线程等待另一个线程执行某个操作直到指定的某个时间时。

  • Runable(运行):在Java虚拟机中执行的线程处于此状态( RUNNABLE状态包括了操作系统线程状态中的Running和Ready,即不一定正在CPU中运行,因为Java虚拟机进程只是CPU众多执行进程中的一个)。

  • Blocked(阻塞)等待监视器的阻塞线程的线程状态。

  • Terminated(结束):线程已经完成执行(即run()方法走完了)。
    在操作系统内部可能已经注销了相应的线程,或者将它复用给其他需要使用线程的请求,而在Java语言级别只是通过Java代码看到的线程状态而已。

线程状态转换

在这里插入图片描述

注意:
  1. 不代表调用了start(),状态就立即改变,中间还有一些步骤,如果在这个启动的过程中有另一个线程来获取它的状态,其实是不确定的,要看那些中间步骤是否已经完成了。

查看线程状态

  • 获取任意Java线程的状态可以使用 java.lang.Thread类中定义的 getState()方法
  • 获取当前线程的状态就可以使用Thread.currentThread().getState()来获取。
    关于getState()方法:
    返回的类型是一个枚举类型,是Thread内部的一个枚举,全称为“java.lang.Thread.State”,这个枚举中定义的类型列表就是Java语言这个级别对应的线程状态列表,包含了NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED这些值。

“VisualVM线程监控线程状态”与“Java线程状态”对应关系

在这里插入图片描述

常见问题

“阻塞”和“等待”的区别

  • “阻塞”状态是等待着获取到一个排他锁,进入“阻塞”状态都是被动的,离开“阻塞”状态是因为其它线程释放了锁,不阻塞了;
  • “等待”状态是在等待一段时间 或者 唤醒动作的发生,进入“等待”状态是主动的,离开“等待”状态是因为其它线程发生了唤醒动作或者到达了等待时间。

做这样的区分,是jvm出于管理的需要,做了这种区分,比如两个原因的线程放两个队列里管理,如果别的线程运行出了synchronized这段代码,我只需要去blocked队列,放个出来。而某人调用了notify(),我只需要去waitting队列里取个出来。


参考文献

http://www.cnblogs.com/trust-freedom/p/6606594.html Java线程状态详解,阻塞和等待的区别
https://my.oschina.net/whc20011/blog/761459 线程状态
https://docs.oracle.com/javase/8/docs/api/index.html java8 ThreadState类
https://www.zhihu.com/question/27654579 阻塞和等待的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值