线程状态的转换:

1646899544581.png

情况一:NEW—->RUNNAGBLE

调用 t.start()方法

情况二: RUNNABLE —-> WAITING

1.t线程用synchronized获得到对象锁之后

  1. 调用wait() t线程从RUNNABLE ---> WAITING
  2. 调用notifynotifyAllinterrupt
  3. 若竞争锁成功,t线程从WAITING --> RUNNABLE
  4. 若竞争锁失败,t线程从WAITING --> BLOCKED

2.当前线程调用t.join方法,当前线程从RUNNABLE—> WAITING状态

  1. 注意是当前线程在t线程对象的监视器上等待

t线程运行结束后,或调用了当前线程的interrupt时,当前线程从WAITING —> RUNNABLE

3.调用LockSupport.park和unpark会发生RUNNABLE和WAITING状态的转换

情况三:RUNNABLE—>TIMED_WAITING (与上述情况相比多了一个超时时间)

1.调用wait(long timeout)和notify()

2.调用t.join(long n) 和 interrupt

3.调用sleep(long n),超出时间后会恢复

4.调用LockSupport.parkNanos(long nanos) 和LockSupport.parkUntil(long millis)(与park和unpark相比多了超时时间)