6种线程状态
Java语言定义了6种线程状态,在任意一个时间点,一个线程只能有且只有其中的一种状态。
-
New(新建):创建后尚未启动的线程处于此状态。此时,JVM会为线程对象分配内存,初始化其成员变量。
-
Waiting(无限期等待):该线程无限期地等待另一个线程执行某个特定操作时。
-
Timed Waiting(限期等待):该线程等待另一个线程执行某个操作直到指定的某个时间时。
-
Runable(运行):在Java
虚拟机
中执行的线程处于此状态( RUNNABLE状态包括了操作系统线程状态中的Running和Ready,即不一定正在CPU中运行,因为Java虚拟机进程只是CPU众多执行进程中的一个
)。 -
Blocked(阻塞):
等待
监视器锁
的阻塞线程的线程状态。 -
Terminated(结束):线程已经完成执行(即run()方法走完了)。
在操作系统内部可能已经注销了相应的线程,或者将它复用给其他需要使用线程的请求,而在Java语言级别只是通过Java代码看到的线程状态而已。
线程状态转换
注意:
- 不代表调用了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 阻塞和等待的区别