線程狀态轉換
![](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
在這裡插入圖檔描述