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