更新時(shí)間:2022-09-22 10:13:27 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1357次
了解Java 中 sleep() 和 wait() 方法之間的區(qū)別。了解何時(shí)使用哪種方法以及它們?cè)贘ava 并發(fā)中帶來(lái)的影響。
sleep()是一種用于暫停進(jìn)程幾秒鐘或我們想要的時(shí)間的方法。但是在wait()notify()方法的情況下,線程進(jìn)入等待狀態(tài)并且在我們調(diào)用or之前它不會(huì)自動(dòng)返回notifyAll()。
主要區(qū)別在于,在等待時(shí)釋放鎖或wait()監(jiān)視器sleep()而不釋放鎖或監(jiān)視器。wait()用于線程間通信,而sleep()通常用于引入執(zhí)行暫停。
Thread.sleep()將當(dāng)前線程發(fā)送到“不可運(yùn)行”狀態(tài)一段時(shí)間。線程保留它已獲取的監(jiān)視器——即,如果線程當(dāng)前位于synchronized塊或方法中,則沒(méi)有其他線程可以進(jìn)入該塊或方法。如果另一個(gè)線程調(diào)用t.interrupt(). 它會(huì)喚醒睡眠線程。
Whilesleep()是一種static方法,這意味著它始終會(huì)影響當(dāng)前線程(正在執(zhí)行 sleep 方法的線程)。一個(gè)常見(jiàn)的錯(cuò)誤是調(diào)用t.sleep()where tis a different thread;即使這樣,睡眠的也是當(dāng)前線程,而不是t線程。
睡眠()示例
synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}
等待()示例
synchronized(LOCK)
{
LOCK.wait(); // LOCK is not held
}
讓我們對(duì)以上所有要點(diǎn)進(jìn)行簡(jiǎn)單的分類以記住。
(1)調(diào)用的方法
wait()– 調(diào)用一個(gè)對(duì)象;當(dāng)前線程必須在鎖對(duì)象上同步。
sleep()– 調(diào)用線程;總是當(dāng)前正在執(zhí)行的線程。
(2)同步的
wait()– 當(dāng)同步多個(gè)線程一個(gè)一個(gè)訪問(wèn)同一個(gè)對(duì)象時(shí)。
sleep()– 當(dāng)同步多個(gè)線程等待休眠線程的休眠時(shí)。
(3)鎖定持續(xù)時(shí)間
wait()– 釋放鎖以使其他對(duì)象有機(jī)會(huì)執(zhí)行。
sleep()– 如果指定超時(shí)或有人中斷,至少保持鎖定 t 次。
(4)喚醒狀態(tài)
wait()– 直到從對(duì)象調(diào)用 notify()、notifyAll()
sleep()– 直到至少時(shí)間到期或調(diào)用中斷()。
(5)用法
sleep()– 用于時(shí)間同步
wait()– 用于多線程同步。
以上就是關(guān)于“Java中wait和sleep的區(qū)別”介紹,大家如果對(duì)此比較感興趣,想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下本站的Java多線程編程,里面還有更豐富的知識(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ì)電話與您溝通安排學(xué)習(xí)