更新時(shí)間:2022-09-22 10:13:27 來源:動力節(jié)點(diǎn) 瀏覽1238次
了解Java 中 sleep() 和 wait() 方法之間的區(qū)別。了解何時(shí)使用哪種方法以及它們在Java 并發(fā)中帶來的影響。
sleep()是一種用于暫停進(jìn)程幾秒鐘或我們想要的時(shí)間的方法。但是在wait()notify()方法的情況下,線程進(jìn)入等待狀態(tài)并且在我們調(diào)用or之前它不會自動返回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塊或方法中,則沒有其他線程可以進(jìn)入該塊或方法。如果另一個(gè)線程調(diào)用t.interrupt(). 它會喚醒睡眠線程。
Whilesleep()是一種static方法,這意味著它始終會影響當(dāng)前線程(正在執(zhí)行 sleep 方法的線程)。一個(gè)常見的錯(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
}
讓我們對以上所有要點(diǎn)進(jìn)行簡單的分類以記住。
(1)調(diào)用的方法
wait()– 調(diào)用一個(gè)對象;當(dāng)前線程必須在鎖對象上同步。
sleep()– 調(diào)用線程;總是當(dāng)前正在執(zhí)行的線程。
(2)同步的
wait()– 當(dāng)同步多個(gè)線程一個(gè)一個(gè)訪問同一個(gè)對象時(shí)。
sleep()– 當(dāng)同步多個(gè)線程等待休眠線程的休眠時(shí)。
(3)鎖定持續(xù)時(shí)間
wait()– 釋放鎖以使其他對象有機(jī)會執(zhí)行。
sleep()– 如果指定超時(shí)或有人中斷,至少保持鎖定 t 次。
(4)喚醒狀態(tài)
wait()– 直到從對象調(diào)用 notify()、notifyAll()
sleep()– 直到至少時(shí)間到期或調(diào)用中斷()。
(5)用法
sleep()– 用于時(shí)間同步
wait()– 用于多線程同步。
以上就是關(guān)于“Java中wait和sleep的區(qū)別”介紹,大家如果對此比較感興趣,想了解更多相關(guān)知識,不妨來關(guān)注一下本站的Java多線程編程,里面還有更豐富的知識等著大家去學(xué)習(xí),希望對大家能夠有所幫助。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743