操作系统线程的五种状态
JAVA线程的六种状态
public enum State {//线程刚创建NEW,//在JVM中正在运行的线程RUNNABLE,//阻塞BLOCKED,//无限期等待WAITING,//限期等待TIMED_WAITING,//线程执行完毕,已经退出TERMINATED;}

上图中少了一个 waiting -> blocked 为线程被唤醒后竞争锁失败,会进入blocked状态。
:::tips 注意:操作系统的阻塞状态在java中是runnable状态!!! :::
Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的【可运行状态】、【运行状态】和【阻塞状态】(比如由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为是可运行)









所以实际上的status是根据C++里面的线程状态转换而来的
转换的过程,根据不同的平台而定 
sleep
- 当前线程调用 Thread.sleep(long n) ,当前线程从 RUNNABLE —> TIMED_WAITING
- 当前线程等待时间超过了 n 毫秒,当前线程从 TIMED_WAITING —> RUNNABLE
wait
t 线程用 synchronized(obj) 获取了对象锁后
- 调用 obj.wait() 方法时,t 线程从 RUNNABLE —> WAITING
调用 obj.notify() , obj.notifyAll() , t.interrupt() 时
当前线程调用 t.join(long n) 方法时,当前线程从 RUNNABLE —> TIMED_WAITING
- 注意是当前线程在t 线程对象的监视器上等待
当前线程等待时间超过了 n 毫秒,或t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从TIMED_WAITING —> RUNNABLE
park
当前线程调用 LockSupport.park() 方法会让当前线程从 RUNNABLE —> WAITING
- 调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,会让目标线程从 WAITING —> RUNNABLE


