最近太忙,好久没更新了,上次写的是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
中止状态,当我们线程抛出异常或者执行结束进入此状态。
这几种状态也组成了线程的生命周期。