线程状态的转换:
情况一:NEW—->RUNNAGBLE
调用 t.start()方法
情况二: RUNNABLE —-> WAITING
1.t线程用synchronized获得到对象锁之后
调用wait() t线程从RUNNABLE ---> WAITING
调用notify、notifyAll、interrupt时
若竞争锁成功,t线程从WAITING --> RUNNABLE
若竞争锁失败,t线程从WAITING --> BLOCKED
2.当前线程调用t.join方法,当前线程从RUNNABLE—> WAITING状态
注意是当前线程在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相比多了超时时间)