6.线程状态转换

线程状态转换

1. New -> Runnable

当调用 t.start() 方法时,由 NEW –> RUNNABLE

2. RUNNABLE <–> WAITING

当线程执行synchronized(obj)获取了对象锁后:

  • 调用obj.wait()方法时,t线程从 Runnable –> waiting
  • 调用obj.notify() , obj.notifyAll() , t.interrupt()
    • 竞争锁成功,t 线程WAITING –> RUNNABLE
    • 竞争锁失败,t 线程WAITING –> BLOCKED

3. RUNNABLE <–> WAITING

  • 当前线程调用 t.join() 方法时,当前线程RUNNABLE –> WAITING
    • 注意是当前线程t 线程对象的监视器上等待
  • t 线程运行结束,或调用了当前线程interrupt() 时,当前线程WAITING –> RUNNABLE

4. RUNNABLE <–> WAITING

  • 当前线程调用 LockSupport.park() 方法会让当前线程RUNNABLE –> WAITING
  • 调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,会让目标线程从 WAITING –>RUNNABLE

5. RUNNABLE <–> TIMED_WAITING

t 线程用 synchronized(obj) 获取了对象锁后 :

  • 调用 obj.wait(long n) 方法时,t 线程RUNNABLE –> TIMED_WAITING
  • t 线程等待时间超过了 n 毫秒,或调用 obj.notify()obj.notifyAll()t.interrupt()
    • 竞争锁成功,t 线程TIMED_WAITING –> RUNNABLE
    • 竞争锁失败,t 线程TIMED_WAITING –> BLOCKED

6. RUNNABLE <–> TIMED_WAITING

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

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

7 RUNNABLE <–> TIMED_WAITING

  • 当前线程调用 Thread.sleep(long n) ,当前线程从 RUNNABLE –> TIMED_WAITING
  • 当前线程等待时间超过了 n 毫秒,当前线程TIMED_WAITING –> RUNNABLE

8. RUNNABLE <–> TIMED_WAITING

  • 当前线程调用 LockSupport.parkNanos(long nanos)LockSupport.parkUntil(long millis) 时,当前线 程RUNNABLE –> TIMED_WAITING
  • 调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,或是等待超时,会让目标线程从 TIMED_WAITING–> RUNNABLE

9 RUNNABLE <–> BLOCKED

  • t 线程synchronized(obj) 获取对象锁时如果竞争失败,从RUNNABLE –> BLOCKED
  • 持 obj 锁线程的同步代码块执行完毕,会唤醒该对象上所有 BLOCKED的线程重新竞争,如果其中 t 线程竞争 成功,从 BLOCKED –> RUNNABLE ,其它失败的线程仍然BLOCKED

10 RUNNABLE –> TERMINATED

当前线程所有代码运行完毕,进入 TERMINATED

0%