[譯]Java中Wait娃属、Sleep和Yield方法的區(qū)別

原文地址:Difference between Wait and Sleep, Yield in Java

Java中wait玄呛、sleep的區(qū)別或者Java中sleep、yield的區(qū)別是Java面試或者多線程面試中最常問的問題之一幌绍。在這3個在Java中能夠用來暫停線程的方法中,sleep()和yield()方法是定義在Thread類中故响,而wait()方法是定義在Object類中的傀广, 這也是面試中常問的一個問題。

wait()和sleep()的關(guān)鍵的區(qū)別在于彩届,wait()是用于線程間通信的伪冰,而sleep()是用于短時間暫停當(dāng)前線程。更加明顯的一個區(qū)別在于樟蠕,當(dāng)一個線程調(diào)用wait()方法的時候贮聂,會釋放它鎖持有的對象的管程和鎖靠柑,但是調(diào)用sleep()方法的時候,不會釋放他所持有的管程吓懈。

回到y(tǒng)ield()方法上來歼冰,與wait()和sleep()方法有一些區(qū)別,它僅僅釋放線程所占有的CPU資源耻警,從而讓其他線程有機(jī)會運行隔嫡,但是并不能保證某個特定的線程能夠獲得CPU資源。誰能獲得CPU完全取決于調(diào)度器甘穿,在有些情況下調(diào)用yield方法的線程甚至?xí)俅蔚玫紺PU資源腮恩。所以,依賴于yield方法是不可靠的温兼,它只能盡力而為秸滴。

Wait vs Sleep vs Yield in Java

Java中wait和sleep的區(qū)別

wait和sleep的主要區(qū)別是調(diào)用wait方法時,線程在等待的時候會釋放掉它所獲得的monitor募判,但是調(diào)用Thread.sleep()方法時荡含,線程在等待的時候仍然會持有monitor或者鎖。另外届垫,Java中的wait方法應(yīng)在同步代碼塊中調(diào)用内颗,但是sleep方法不需要。
另一個區(qū)別是Thread.sleep()方法是一個靜態(tài)方法敦腔,作用在當(dāng)前線程上均澳;但是wait方法是一個實例方法,并且只能在其他線程調(diào)用本實例的notify()方法時被喚醒符衔。另外找前,使用sleep方法時,被暫停的線程在被喚醒之后會立即進(jìn)入就緒態(tài)(Runnable state)判族,但是使用wait方法的時候躺盛,被暫停的線程會首先獲得鎖(譯者注:阻塞態(tài)),然后再進(jìn)入就緒態(tài)形帮。所以槽惫,根據(jù)你的需求,如果你需要暫定你的線程一段特定的時間就使用sleep()方法辩撑,如果你想要實現(xiàn)線程間通信就使用wait()方法界斜。
下面列出Java中wait和sleep方法的區(qū)別:

  1. wait只能在同步(synchronize)環(huán)境中被調(diào)用,而sleep不需要合冀。詳見Why to wait and notify needs to call from synchronized method
  2. 進(jìn)入wait狀態(tài)的線程能夠被notify和notifyAll線程喚醒各薇,但是進(jìn)入sleeping狀態(tài)的線程不能被notify方法喚醒。
  3. wait通常有條件地執(zhí)行君躺,線程會一直處于wait狀態(tài)峭判,直到某個條件變?yōu)檎婵小5莝leep僅僅讓你的線程進(jìn)入睡眠狀態(tài)。
  4. wait方法在進(jìn)入wait狀態(tài)的時候會釋放對象的鎖林螃,但是sleep方法不會奕删。
  5. wait方法是針對一個被同步代碼塊加鎖的對象,而sleep是針對一個線程疗认。更詳細(xì)的講解可以參考《Java核心技術(shù)卷1》急侥,里面介紹了如何使用wait和notify方法。

yield和sleep的區(qū)別

yield和sleep的主要是侮邀,yield方法會臨時暫停當(dāng)前正在執(zhí)行的線程,來讓有同樣優(yōu)先級的正在等待的線程有機(jī)會執(zhí)行贝润。如果沒有正在等待的線程绊茧,或者所有正在等待的線程的優(yōu)先級都比較低,那么該線程會繼續(xù)運行打掘。執(zhí)行了yield方法的線程什么時候會繼續(xù)運行由線程調(diào)度器來決定华畏,不同的廠商可能有不同的行為。yield方法不保證當(dāng)前的線程會暫妥鹨希或者停止亡笑,但是可以保證當(dāng)前線程在調(diào)用yield方法時會放棄CPU。
在Java中Sleep方法有兩個横朋, 一個只有一個毫秒?yún)?shù)仑乌,另一個有毫秒和納秒兩個參數(shù)。

sleep(long millis)

or

sleep(long millis, int nanos)

會讓當(dāng)前執(zhí)行的線程sleep指定的時間琴锭。

下面這張圖很好地展示了在調(diào)用wait晰甚、sleep、yield方法的時候决帖,線程狀態(tài)如何轉(zhuǎn)換厕九。

Paste_Image.png

Java中sleep方法的幾個注意點:

  1. Thread.sleep()方法用來暫停線程的執(zhí)行,將CPU放給線程調(diào)度器地回。
  2. Thread.sleep()方法是一個靜態(tài)方法扁远,它暫停的是當(dāng)前執(zhí)行的線程。
  3. Java有兩種sleep方法刻像,一個只有一個毫秒?yún)?shù)畅买,另一個有毫秒和納秒兩個參數(shù)。
  4. 與wait方法不同细睡,sleep方法不會釋放鎖
  5. 如果其他的線程中斷了一個休眠的線程皮获,sleep方法會拋出Interrupted Exception。
  6. 休眠的線程在喚醒之后不保證能獲取到CPU纹冤,它會先進(jìn)入就緒態(tài)洒宝,與其他線程競爭CPU购公。
  7. 有一個易錯的地方,當(dāng)調(diào)用t.sleep()的時候雁歌,會暫停線程t宏浩。這是不對的,因為Thread.sleep是一個靜態(tài)方法靠瞎,它會使當(dāng)前線程而不是線程t進(jìn)入休眠狀態(tài)比庄。

這就是java中的sleep方法。我們已經(jīng)看到了java中sleep乏盐、wait以及yield方法的區(qū)別佳窑。總之父能,記住sleep和yield作用于當(dāng)前線程神凑。


感謝您的閱讀!
本賬號已經(jīng)不再更新何吝,更多文章請移步我的個人博客https://www.zacharyjia.me

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溉委,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爱榕,更是在濱河造成了極大的恐慌瓣喊,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黔酥,死亡現(xiàn)場離奇詭異藻三,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跪者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門趴酣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坑夯,你說我怎么就攤上這事岖寞。” “怎么了柜蜈?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵仗谆,是天一觀的道長。 經(jīng)常有香客問我淑履,道長隶垮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任秘噪,我火速辦了婚禮狸吞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己蹋偏,他們只是感情好便斥,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著威始,像睡著了一般枢纠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黎棠,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天晋渺,我揣著相機(jī)與錄音,去河邊找鬼脓斩。 笑死木西,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的随静。 我是一名探鬼主播八千,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挪挤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起关翎,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扛门,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纵寝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體论寨,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年爽茴,在試婚紗的時候發(fā)現(xiàn)自己被綠了葬凳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡室奏,死狀恐怖火焰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胧沫,我是刑警寧澤昌简,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站绒怨,受9級特大地震影響纯赎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜南蹂,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一犬金、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦晚顷、人聲如沸峰伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽词爬。三九已至,卻和暖如春权均,著一層夾襖步出監(jiān)牢的瞬間顿膨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工叽赊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留恋沃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓必指,卻偏偏與公主長得像囊咏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塔橡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍(lán)閱讀 7,350評論 3 87
  • sleep()和yield()方法是定義在Thread類中葛家,而wait()方法是定義在Object類中户辞。 wait...
    NoFacePeace閱讀 497評論 0 0
  • 本文主要講了java中多線程的使用方法、線程同步癞谒、線程數(shù)據(jù)傳遞底燎、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等弹砚。 首先講...
    李欣陽閱讀 2,454評論 1 15
  • 親愛的黑先生: 我覺得現(xiàn)在的生活挺好的双仍,可能我真的就是個矛盾結(jié)合體。如此安逸的生活我又會考慮很多桌吃,考慮未來朱沃,考慮可...
    疏閣閱讀 234評論 0 1
  • 明天就是一年一度的母親節(jié)了,我不太喜歡我們家的生活方式茅诱,基本團(tuán)聚出去玩都是過年的時候为流。如今我們長大了,父母也老了而...
    閑來浮生若夢閱讀 458評論 0 0