更新時(shí)間:2022-12-08 11:55:44 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1630次
Java線程狀態(tài)轉(zhuǎn)換有哪些情況?動(dòng)力節(jié)點(diǎn)小編來告訴大家。
?當(dāng)調(diào)用t.start()方法的時(shí)候,由NEW–>Runnable
? t線程用synchronize(obj)獲得對(duì)象鎖后:
? 調(diào)用obj.wait()方法時(shí),t線程從RUNNABLE–>WAITING
? 調(diào)用obj.notify(),obj.notifyAll,t.interrupt時(shí):
? 競(jìng)爭(zhēng)鎖成功,t線程WAITING–>RUNNABLE
? 競(jìng)爭(zhēng)鎖失敗,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("執(zhí)行....");
try {
obj.wait(); // 讓線程在obj上一直等待下去
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("其它代碼....");
}
},"t1").start();
new Thread(() -> {
synchronized (obj) {
log.debug("執(zhí)行....");
try {
obj.wait(); // 讓線程在obj上一直等待下去
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("其它代碼....");
}
},"t2").start();
// 主線程兩秒后執(zhí)行
sleep(0.5);
log.debug("喚醒 obj 上其它線程");
synchronized (obj) {
// obj.notify(); // 喚醒obj上一個(gè)線程
obj.notifyAll(); // 喚醒obj上所有等待線程
}
}
}
當(dāng)前線程調(diào)用t.join()方法時(shí),當(dāng)前線程從RUNNABLE --> WAITING
注意是從當(dāng)前線程在t線程對(duì)象的監(jiān)視器上等待
t線程運(yùn)行結(jié)束,活調(diào)用了當(dāng)前線程的interrupt()時(shí),當(dāng)前線程從WAITING–> RUNNNABLE
當(dāng)前線程調(diào)用LockSupport.park()方法會(huì)讓當(dāng)前線程從RUNNABLE --> WAITING
調(diào)用LockSupport.unpark(目標(biāo)線程)或調(diào)用了線程的interrupt(),會(huì)讓目標(biāo)線程從WAITING -->RUNNABLE
t線程用synchronize(obj)獲取了對(duì)象鎖后
調(diào)用obj.wait(long n)方法時(shí),t線程從RUNABLE -->TIMED_WAITING
t線程等待時(shí)間超過了n毫秒,或調(diào)用obj.notify(),obj.notifyAll(),t.interrupt時(shí)
競(jìng)爭(zhēng)鎖成功,t線程從TIMED_WAITING -->RUNNABLE
競(jìng)爭(zhēng)鎖失敗,t線程從TIMED_WAITING --> BLOCKED
當(dāng)前線程調(diào)用t.join(long n) 方法是,當(dāng)前線程從RUNNABLE --> TIMED_WAITING
注意是當(dāng)前線程在t線程****對(duì)象的監(jiān)視器上等待
當(dāng)前線程等待時(shí)間超過了n毫秒,或t線程運(yùn)行結(jié)束,調(diào)用了當(dāng)前線程的interrupt()時(shí),當(dāng)前線程從TIMED_WAITING --> RUNNABLE
當(dāng)前線程調(diào)用Thread.Sleep(long n) ,當(dāng)前線程從RUNNABLE -->TIMED_WAITING
當(dāng)前線程等待時(shí)間超過了n毫秒,當(dāng)前線程從TIMED_WAITING -->RUNNABLE
當(dāng)前線程調(diào)用LockSupport.parkNanos(long nanos) 或LockSupport.parkUntil(long millis)時(shí),當(dāng)前線程從RUNNABLE -->TIMED_WATTING
調(diào)用LockSupport.unpark(目標(biāo)線程)或調(diào)用了線程的interrupt(),或是等待超時(shí),會(huì)讓目標(biāo)線程從TIMED_WATTING–> RUNNABLE
t線程用synchronized(obj)獲取了對(duì)象鎖時(shí)如果競(jìng)爭(zhēng)失敗,從RUNNABLE -->BLOCKED
持obj鎖線程的同步代碼塊執(zhí)行完畢,會(huì)喚醒該帝鄉(xiāng)上所有的BLOCKED的線程重新競(jìng)爭(zhēng),如果其中t線程競(jìng)爭(zhēng)成功,從BLOCKED -->RUNNABLE,其他失敗的線程任然BLOCKED
當(dāng)前線程所有代碼運(yùn)行完成,進(jìn)入TERMINATED
–>RUNNABLE,其他失敗的線程任然BLOCKED
情況10 RUNNABLE<–>TERMINATED
當(dāng)前線程所有代碼運(yùn)行完成,進(jìn)入TERMINATED
以上就是關(guān)于“Java線程狀態(tài)轉(zhuǎn)換的情況介紹”,大家如果想了解更多相關(guān)知識(shí),不妨來關(guān)注一下本站的Java多線程編程技術(shù)文檔,里面還有更豐富的知識(shí)等著大家去學(xué)習(xí),希望對(duì)大家能夠有所幫助。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743