JAVA基础 之 Thread的6种状态

最近太忙,好久没更新了,上次写的是Tread源码分析,这次再补上一个关于线程的几种状态吧。

 

线程状态在Thread的源码中有一个子枚举state。里面定义了6种状态:

 

1,NEW

当我们新建一个线程对象时,此时线程是属于这个状态的。

 

2,Runnable

有了线程对象,当调用该线程的start()时,线程就从new转变成runnable。表示该线程准备就绪,可以分配CPU运行。

但具体什么时候运行,我们并不知道。

JVM中的runnable状态和CPU中的状态并不一样。因为现代CPU一般使用时间分片方式进行线程的调度。所以每个线程在CPU中执行的时间会很短。所以真正CPU中的线程状态,会经常在ready,running,waiting中切换。比如当线程进行一个IO操作时,就会在CPU中将running切换到了waiting,等待IO结束,硬盘会给CPU一个callback,告诉他IO结束,这时候CPU才会将waiting又转换到ready重新进入调度队列。但这对于JVM来说他并不关心这些。即使CPU将他放入waiting队列,还是会有硬盘在为这个线程执行一些内容。所以JVM只需要使用runnable表示即可。

 

3,Blocked

当A线程进入一个被synchronized修饰的方法或者代码块时,如果当前已经有B线程进入了,那么A线程就会进入Blocked状态。直到B线程释放锁。

 

4,waiting

当线程A中创建一个线程B,并且调用了b.join()方法时,A线程则需要等待B线程执行结束才继续执行。这是主线程就是waiting状态。或者是调用了wait方法后也会到waiting状态。

 

5,timed_waiting

顾名思义,就是有时间限定的等待状态。比如b.join(time),sleep(time);wait(time)都会进入这个状态。

 

6,TERMINATED

中止状态,当我们线程抛出异常或者执行结束进入此状态。

 

这几种状态也组成了线程的生命周期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章