操作系统线程的五种状态

image.png

另外,C++ 里面定义OSThread的状态有9种

image.png

JAVA线程的六种状态

  1. public enum State {
  2. //线程刚创建
  3. NEW,
  4. //在JVM中正在运行的线程
  5. RUNNABLE,
  6. //阻塞
  7. BLOCKED,
  8. //无限期等待
  9. WAITING,
  10. //限期等待
  11. TIMED_WAITING,
  12. //线程执行完毕,已经退出
  13. TERMINATED;
  14. }

6.线程的状态 - 图5
上图中少了一个 waiting -> blocked 为线程被唤醒后竞争锁失败,会进入blocked状态。

:::tips 注意:操作系统的阻塞状态在java中是runnable状态!!! :::

Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的【可运行状态】、【运行状态】和【阻塞状态】(比如由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为是可运行)
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
所以实际上的status是根据C++里面的线程状态转换而来的
image.png

转换的过程,根据不同的平台而定
image.png

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 线程从 WAITING —> RUNNABLE
    • 竞争锁失败,t 线程从 WAITING —> BLOCKED

      join

  • 当前线程调用 t.join(long n) 方法时,当前线程从 RUNNABLE —> TIMED_WAITING

  • 注意是当前线程在t 线程对象的监视器上等待
  • 当前线程等待时间超过了 n 毫秒,或t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从TIMED_WAITING —> RUNNABLE

    park

  • 当前线程调用 LockSupport.park() 方法会让当前线程从 RUNNABLE —> WAITING

  • 调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,会让目标线程从 WAITING —> RUNNABLE