java多线程的6种线程状态以及这6种状态间的转换关系,是怎么转换的,转换时发生了什么[面试必备]

在这里插入图片描述

  • 线条1
    • new 线程 进入NEW ,start之后进入RUNNABLE
  • 线条2
    • 获取了锁的线程执行wait,线程从RUNNABLE–>WAITING
    • 线程被打断 interrupt
      • 成功争夺到锁资源 WAITING–> RUNNABLE
      • 没有争夺到锁资源 WAITING–> RUNNABLE–>BLOCKED
    • 线程被notify之后
      • 成功争夺到锁资源 WAITING–> RUNNABLE
      • 没有争夺到锁资源 WAITING–> RUNNABLE–>BLOCKED
  • 线条3
    • a线程 join另外的b线程 a线程RUNNABLE–>WAITING
    • b线程运行完 a线程WAITING–>RUNNABLE
    • a线程执行interrupt后 a线程WAINTING–>RUNNABLE
  • 线条4
    • 当前线程调用了LockSupport.park()方法会让当前线程从RUNNABLE–>WAITING
    • 调用LockSupport.unpark(目标线程对象)或调用了该线程的interrupt()会让当前线程从WAITING–>RUNNABLE
  • 线条5
    • 获取了锁的线程执行wait(long n),线程从RUNNABLE–>TIMED_WAITING
    • 线程被打断 interrupt
      • 成功争夺到锁资源 TIMED_WAITING–> RUNNABLE
      • 没有争夺到锁资源 TIMED_WAITING–> RUNNABLE–>BLOCKED
    • 线程被notify之后
      • 成功争夺到锁资源 TIMED_WAITING–> RUNNABLE
      • 没有争夺到锁资源 TIMED_WAITING–> RUNNABLE–>BLOCKED
  • 线条6
    • a线程 join(long n)另外的b线程 a线程RUNNABLE–>TIMED_WAITING
    • b线程运行完 a线程TIMED_WAITING–>RUNNABLE
    • a线程执行interrupt后 a线程TIMED_WAITING–>RUNNABLE
  • 线条7
    • 当前线程调用了Thread.sleep(long n)后,当前线程从 RUNNABLE–>TIMED_WAITING
    • 当前线程等待了n毫秒之后,当前线程从TIMED_WAITING–>RUNNABLE
    • 调用了当前线程的interrupt()后,当前线程从TIMED_WAITING–>RUNNABLE
  • 线条8
    • 当前线程调用LockSupport.parkNanos(long n)或 LockSupport.parUntil(long n)后当前线程RUNNABLE–>TIMED_WAITING
    • 调用LockSupport.unpark(目标线程对象)或调用了该线程的interrupt(),或等待时间超时,会让当前线程从TIMED_WAITING–>RUNNABLE
  • 线条9
    • 当前线程竞争锁资源时,竞争失败,线程 RUNNABLE–>BLOCKED
    • 当线程被唤醒后,竞争锁资源,竞争成功,当前线程BLOCKED–>RUNNABLE
  • 线条10
    • 当前进程运行完所有代码,当前进程 RUNNABLE–>TERMINAED

猜你喜欢

转载自blog.csdn.net/qq_20156289/article/details/108120450