假设有线程 Thread t
情况1 NEW–>RUNNABLE
- 当调用
t.start()
方法时,由NEW --> RUNNABLE
情况2 RUNNABLE <–> WAITING
t线程用synchronized(obj)
获取了对象锁后
- 调用
obj.wait()
方法时,t线程从RUNNABLE --> WAITING
- 调用
obj.notify()
,obj.notifyAll()
,t.interrupt()
时- 竞争锁成功,t线程从
WAITING --> RUNNABLE
- 竞争锁失败,t线程从
WAITING --> BLOCKED
- 竞争锁成功,t线程从
情况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
- 竞争锁成功,t线程从
- 调用
情况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(目标线程)
或调用了线程的inturrept()
方法,或者等待超时,目标线程从TIMED_WAITING -->RUNNABLE
情况9 RUNNABLE <–> BLOCKED
- t线程用
synchronized(obj)
获取了对象锁,竞争失败时,从RUNNABLE --> BLOCKED
- 持obj锁线程的同步代码块执行完毕,会唤醒改对象上所有
BLOCKED
的线程重新竞争,如果t线程竞争成功,t线程从BLOCKED-->RUNNABLE
,其他线程仍然BLOCKED
情况10 RUNNABLE --> TERMINATED
- 当线程所有代码执行完毕,进入
TERMINATED