线程状态转换
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9EkTxUEVOh3YE5EM4wmYwhGWhxGZzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcukjNxUjMyUTMwIDNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
假设有线程t
情况1 NEW --> RUNNABLE
NEW --> RUNNABLE
- 当调用
方法时,由t.start()
NEW --> RUNNABLE
情况2 RUNNBALE <--> WAITING
RUNNBALE <--> WAITING
t线程 用
synchronized(obj)
获取了对象锁后
- 调用
方法时,t线程从obj.wait()
RUNNABLE --> WAITING
- 调用
,obj.notify()
,obj.notifyAll()
时t.interrupt()
- 竞争锁成功,t线程从
WAITING --> RUNNABLE
- 竞争锁失败,t线程从
WAITING --> BLOCKED
- 竞争锁成功,t线程从
情况3 RUNNBALE <--> WAITING
RUNNBALE <--> WAITING
- 当前线程调用
方法时,当前线程从t.join()
RUNNABLE --> WAITING
- 注意当前线程是在t线程对象的监视器上等待
- t线程运行结束,或调用了当前线程的
时, 当前线程从interrupt()
WAITING --> RUNNABLE
情况4 RUNNBALE <--> WAITING
RUNNBALE <--> WAITING
- 当前线程调用
方法会让当前线程从LockSupport.park()
RUNNABLE --> WAITING
- 调用
或调用了线程的interrupt(),会让目标线程从LockSupport.unpark(目标线程)
WAITING --> RUNNABLE
情况5 RUNNBALE <--> TIMED_WAITING
RUNNBALE <--> TIMED_WAITING
t 线程用
synchronized(obj)
获取了对象锁后
- 调用
方法时,t 线程从obj.wait(long n)
RUNNABLE --> TIMED_WAITING
- t 线程等待时间超过了 n 毫秒,或调用
,obj.notify()
,obj.notifyAll()
时t.interrupt()
- 竞争锁成功,t 线程从
TIMED_WAITING --> RUNNABLE
- 竞争锁失败,t 线程从
TIMED_WAITING --> BLOCKED
- 竞争锁成功,t 线程从
情况6 RUNNBALE <--> TIMED_WAITING
RUNNBALE <--> TIMED_WAITING
- 当前线程调用 t.join(long n) 方法时,当前线程从
RUNNABLE --> TIMED_WAITING
- 注意是当前线程在t 线程对象的监视器上等待
- 当前线程等待时间超过了 n 毫秒,或t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从
TIMED_WAITING --> RUNNABLE
情况7 RUNNBALE <--> TIMED_WAITING
RUNNBALE <--> TIMED_WAITING
- 当前线程调用
,当前线程从Thread.sleep(long n)
RUNNABLE --> TIMED_WAITING
- 当前线程等待时间超过了 n 毫秒,当前线程从
TIMED_WAITING --> RUNNABLE
情况8 RUNNBALE <--> TIMED_WAITING
RUNNBALE <--> TIMED_WAITING
- 当前线程调用
或LockSupport.parkNanos(long nanos)
时,当前线程从LockSupport.parkUntil(long millis)
RUNNABLE --> TIMED_WAITING
- 调用
或调用了线程 的LockSupport.unpark(目标线程)
,或是等待超时,会让目标线程从interrupt()
TIMED_WAITING--> RUNNABLE
情况 9 RUNNABLE <--> BLOCKED
RUNNABLE <--> BLOCKED
- t 线程用
获取了对象锁时如果竞争失败,从synchronized(obj)
RUNNABLE --> BLOCKED
- 持 obj 锁线程的同步代码块执行完毕,会唤醒该对象上所有
的线程重新竞争,如果其中 t 线程竞争成功,从BLOCKED
,其它失败的线程仍然BLOCKED --> RUNNABLE
BLOCKED
情况 10 RUNNABLE <--> TERMINATED
RUNNABLE <--> TERMINATED
当前线程所有代码运行完毕,进入
TERMINATED
在这里插入图片描述