更新時間:2022-12-08 11:55:44 來源:動力節點 瀏覽1397次
Java線程狀態轉換有哪些情況?動力節點小編來告訴大家。
?當調用t.start()方法的時候,由NEW–>Runnable
? t線程用synchronize(obj)獲得對象鎖后:
? 調用obj.wait()方法時,t線程從RUNNABLE–>WAITING
? 調用obj.notify(),obj.notifyAll,t.interrupt時:
? 競爭鎖成功,t線程WAITING–>RUNNABLE
? 競爭鎖失敗,t線程從WAITING–>BLOCKED
@Slf4j(topic = "c.TestWaitNotify")
public class TestWaitNotify {
final static Object obj = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (obj) {
log.debug("執行....");
try {
obj.wait(); // 讓線程在obj上一直等待下去
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("其它代碼....");
}
},"t1").start();
new Thread(() -> {
synchronized (obj) {
log.debug("執行....");
try {
obj.wait(); // 讓線程在obj上一直等待下去
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("其它代碼....");
}
},"t2").start();
// 主線程兩秒后執行
sleep(0.5);
log.debug("喚醒 obj 上其它線程");
synchronized (obj) {
// obj.notify(); // 喚醒obj上一個線程
obj.notifyAll(); // 喚醒obj上所有等待線程
}
}
}
當前線程調用t.join()方法時,當前線程從RUNNABLE --> WAITING
注意是從當前線程在t線程對象的監視器上等待
t線程運行結束,活調用了當前線程的interrupt()時,當前線程從WAITING–> RUNNNABLE
當前線程調用LockSupport.park()方法會讓當前線程從RUNNABLE --> WAITING
調用LockSupport.unpark(目標線程)或調用了線程的interrupt(),會讓目標線程從WAITING -->RUNNABLE
t線程用synchronize(obj)獲取了對象鎖后
調用obj.wait(long n)方法時,t線程從RUNABLE -->TIMED_WAITING
t線程等待時間超過了n毫秒,或調用obj.notify(),obj.notifyAll(),t.interrupt時
競爭鎖成功,t線程從TIMED_WAITING -->RUNNABLE
競爭鎖失敗,t線程從TIMED_WAITING --> BLOCKED
當前線程調用t.join(long n) 方法是,當前線程從RUNNABLE --> TIMED_WAITING
注意是當前線程在t線程****對象的監視器上等待
當前線程等待時間超過了n毫秒,或t線程運行結束,調用了當前線程的interrupt()時,當前線程從TIMED_WAITING --> RUNNABLE
當前線程調用Thread.Sleep(long n) ,當前線程從RUNNABLE -->TIMED_WAITING
當前線程等待時間超過了n毫秒,當前線程從TIMED_WAITING -->RUNNABLE
當前線程調用LockSupport.parkNanos(long nanos) 或LockSupport.parkUntil(long millis)時,當前線程從RUNNABLE -->TIMED_WATTING
調用LockSupport.unpark(目標線程)或調用了線程的interrupt(),或是等待超時,會讓目標線程從TIMED_WATTING–> RUNNABLE
t線程用synchronized(obj)獲取了對象鎖時如果競爭失敗,從RUNNABLE -->BLOCKED
持obj鎖線程的同步代碼塊執行完畢,會喚醒該帝鄉上所有的BLOCKED的線程重新競爭,如果其中t線程競爭成功,從BLOCKED -->RUNNABLE,其他失敗的線程任然BLOCKED
當前線程所有代碼運行完成,進入TERMINATED
–>RUNNABLE,其他失敗的線程任然BLOCKED
情況10 RUNNABLE<–>TERMINATED
當前線程所有代碼運行完成,進入TERMINATED
以上就是關于“Java線程狀態轉換的情況介紹”,大家如果想了解更多相關知識,不妨來關注一下本站的Java多線程編程技術文檔,里面還有更豐富的知識等著大家去學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習