執行緒狀態轉換

2022-05-05 04:21:13 字數 1954 閱讀 2371

runnable waiting

執行緒用synchronized(obj)獲取了物件鎖後

呼叫obj.wait()方法時,t 執行緒從runnable --> waiting

呼叫obj.notify(),obj.notifyall(),t.interrupt()時

競爭鎖成功,t 執行緒從waiting --> runnable

競爭鎖失敗,t 執行緒從waiting --> blocked

code:

@slf4j

public class test4 catch (interruptedexception e)

log.debug("其他**...");//斷點

}}, "t1").start();

new thread(() -> catch (interruptedexception e)

log.debug("其他**...");//斷點

}}, "t2").start();

try catch (interruptedexception e)

log.debug("喚醒obj上的其他執行緒");

synchronized (obj) }}

runnable waiting

當前執行緒呼叫 locksupport.park() 方法會讓當前執行緒從 runnable --> waiting

呼叫 locksupport.unpark(目標執行緒) 或呼叫了執行緒 的 interrupt() ,會讓目標執行緒從 waiting -->

runnable

runnable waiting

當前執行緒呼叫 t.join() 方法時,當前執行緒從 runnable --> waiting

注意是當前執行緒在t 執行緒物件的監視器上等待

t 執行緒執行結束,或呼叫了當前執行緒的 interrupt() 時,當前執行緒從 waiting --> runnable

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

runnable timed_waiting

當前執行緒呼叫 t.join(long n) 方法時,當前執行緒從 runnable --> timed_waiting

注意是當前執行緒在t 執行緒物件的監視器上等待

當前執行緒等待時間超過了 n 毫秒,或t 執行緒執行結束,或呼叫了當前執行緒的 interrupt() 時,當前執行緒從

timed_waiting --> runnable

runnable timed_waiting

當前執行緒呼叫 thread.sleep(long n) ,當前執行緒從 runnable --> timed_waiting

當前執行緒等待時間超過了 n 毫秒或呼叫了執行緒 的 interrupt() ,當前執行緒從 timed_waiting --> runnable

runnable timed_waiting

當前執行緒呼叫 locksupport.parknanos(long nanos) 或 locksupport.parkuntil(long millis) 時,當前線

程從 runnable --> timed_waiting

呼叫 locksupport.unpark(目標執行緒) 或呼叫了執行緒 的 interrupt() ,或是等待超時,會讓目標執行緒從

timed_waiting--> runnable

執行緒狀態轉換

退出方法 沒有設定 timeout 引數的 object.wait 方法 object.notify object.notifyall 沒有設定 timeout 引數的 thread.join 方法 被呼叫的執行緒執行完畢 locksupport.park 方法 locksupport.unpark...

執行緒狀態轉換

建立後尚未啟動。可能正在執行,也可能正在等待 cpu 時間片。包含了作業系統執行緒狀態中的 running 和 ready。等待獲取乙個排它鎖,如果其執行緒釋放了鎖就會結束此狀態。等待其它執行緒顯式地喚醒,否則不會被分配 cpu 時間片。進入方法 退出方法 沒有設定 timeout 引數的 obje...

執行緒狀態轉換

test public void testthreadstate1 throws exception catch interruptedexception e system.out.println 1 thread.currentthread getname 的狀態是 thread.currentt...