1.原因
多线程是Java实现并发的基础,几乎面试题都会问一些相关的问题。最近在看线程方面的文章时,看到的线程状态图的转换五花八门,虽然大体不错,但是确各不相同。所以决定看下Thread的源码。对线程的状态有了更深的理解。
2.Thread状态
Thread总共有6个状态,这是在源码里面通过枚举规定的。6个状态如下:
NEW | 新建线程 |
RUNNABLE | 运行 |
BLOCKED | 阻塞 |
WAITING | 等待 |
TIMED_WAITING | 时间等待 |
TERMINATED | 死亡 |
1 public enum State { 2 /** 3 * Thread state for a thread which has not yet started. 4 */ 5 NEW, 6 7 /** 8 * Thread state for a runnable thread. A thread in the runnable 9 * state is executing in the Java virtual machine but it may 10 * be waiting for other resources from the operating system 11 * such as processor. 12 */ 13 RUNNABLE, 14 15 /** 16 * Thread state for a thread blocked waiting for a monitor lock. 17 * A thread in the blocked state is waiting for a monitor lock 18 * to enter a synchronized block/method or 19 * reenter a synchronized block/method after calling 20 * {@link Object#wait() Object.wait}. 21 */ 22 BLOCKED, 23 24 /** 25 * Thread state for a waiting thread. 26 * A thread is in the waiting state due to calling one of the 27 * following methods: 28 * <ul> 29 * <li>{@link Object#wait() Object.wait} with no timeout</li> 30 * <li>{@link #join() Thread.join} with no timeout</li> 31 * <li>{@link LockSupport#park() LockSupport.park}</li> 32 * </ul> 33 * 34 * <p>A thread in the waiting state is waiting for another thread to 35 * perform a particular action. 36 * 37 * For example, a thread that has called <tt>Object.wait()</tt> 38 * on an object is waiting for another thread to call 39 * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on 40 * that object. A thread that has called <tt>Thread.join()</tt> 41 * is waiting for a specified thread to terminate. 42 */ 43 WAITING, 44 45 /** 46 * Thread state for a waiting thread with a specified waiting time. 47 * A thread is in the timed waiting state due to calling one of 48 * the following methods with a specified positive waiting time: 49 * <ul> 50 * <li>{@link #sleep Thread.sleep}</li> 51 * <li>{@link Object#wait(long) Object.wait} with timeout</li> 52 * <li>{@link #join(long) Thread.join} with timeout</li> 53 * <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li> 54 * <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li> 55 * </ul> 56 */ 57 TIMED_WAITING, 58 59 /** 60 * Thread state for a terminated thread. 61 * The thread has completed execution. 62 */ 63 TERMINATED; 64 }
3.状态图
根据源码和注释的内容,画出的状态图如下:
4.《JAVA多线程核心编程》中的线程状态图
上面自己的画图有参考此文章,下面贴出文章中的配图。大家购买正版可以看得更全面(书写的很好)。
最后:这里只是列出了Thread源码的部分,对于线程的知识还有很多,以后会慢慢深入学习和分享。了解线程的状态图是基础,对我们深入了解线程,多线程,并发有好处。