NEW 状态
英文翻译过来是线程还是没有开始执行.
首先,既然已经有状态了,那肯定是已经创建好线程对象了(如果对象都没有,何来状态这一说?),这样一来问题的焦点就在于还没有开始执行,我们都知道当调用线程的 start() 方法时,线程不一定会马上执行,因为 Java 线程是映射到操作系统的线程进行执行,此时可能还需要等操作系统调度,但此时该线程的状态已经为 RUNNABLE 了
RUNNABLE 状态
指运行中的线程,一个线程处于 RUNNABLE 状态的意思是在 JVM 层面它是在执行的,但是该线程可能是在等待操作系统的资源,比如说 CPU.这个状态是最有争议的,注释中说了,它表示线程在 JVM 层面是执行的,但在操作系统层面不一定,它举例是 CPU,毫无疑问 CPU 是一个操作系统资源,但这也就意味着在等操作系统其他资源的时候,线程也会是这个状态,这里就有一个关键点 IO 阻塞算是等操作系统的资源么?
BLOCKED 状态:
英文翻译过来是该状态表示线程在阻塞等待 monitor lock(监视器锁).一个线程在进入 synchronized 修饰的临界区的时候, 或者在 synchronized 临界区中调用 Object.wait 然后被唤醒重新进入 synchronized 临界区都对应该状态.结合上面 RUNNABLE 的分析, 也就是 IO 阻塞不会进入 BLOCKED 状态, 只有 synchronized 会导致线程进入该状态.
关于 BLOCKED 状态,注释里只提到一种情况就是进入 synchronized 声明的临界区时会导致,这个也很好理解,synchronized 是 JVM 自己控制的,所以这个阻塞事件它自己能够知道(对比理解上面的操作系统层面).```
来源: http://www.jianshu.com/p/aa78aeb10fea