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

原文:http://www.java67.com/2012/08/what-are-difference-between-wait-and.html

Wait vs sleep

在Java多線程面試?yán)锩嫦罕辏?jīng)常被問(wèn)到wait() 和 sleep() 的區(qū)別沉眶。雖然 wait 和 sleep 都能將線程狀態(tài)變成等待狀態(tài)雁社,但是它們?cè)谛袨楹褪褂梅绞缴贤耆灰粯拥摹hread.sleep(long millis) 會(huì)暫停配喳、釋放CPU資源和給其他線程有執(zhí)行的機(jī)會(huì)赂韵,而wait用于Java線程之間的通信送淆。wait方法定義在java.lang.Object類(lèi)里面章鲤,也就是說(shuō)每個(gè)對(duì)象都能使用到摊灭。這是以對(duì)象鎖為基礎(chǔ)的,如果你記得在Java里面每一個(gè)對(duì)象都有隱藏鎖败徊,也叫監(jiān)視器(monitor)帚呼。當(dāng)一個(gè)線程進(jìn)入一個(gè)synchronized方法的時(shí)候它會(huì)獲得一個(gè)當(dāng)前對(duì)象的鎖,而當(dāng)進(jìn)入的是靜態(tài)(static)的synchronized方法的時(shí)候獲得的是這個(gè)類(lèi)的鎖皱蹦。使用wait()和notify()這兩個(gè)方法可以使得兩個(gè)線程之間進(jìn)行通信煤杀,這也是解決很多多線程問(wèn)題的關(guān)鍵,比如生產(chǎn)者-消費(fèi)者問(wèn)題沪哺,哲學(xué)家就餐問(wèn)題沈自,讀和寫(xiě)的問(wèn)題和實(shí)現(xiàn)一些并發(fā)的設(shè)計(jì)。


在這個(gè)教程辜妓,你會(huì)學(xué)到下列關(guān)于wait()和sleep()方法的問(wèn)題:

1枯途、什么是wait()方法?

2籍滴、什么是sleep()方法酪夷?

3、它們之間有什么區(qū)別异逐?

4捶索、在什么地方使用到wait和sleep?


話說(shuō)灰瞻,如果你是在準(zhǔn)備面試Java的話我建議你還是看一下Java Programming Interview Exposed腥例,一本非常不錯(cuò)的Java面試書(shū)籍。


Java里面的wait和sleep方法是什么

wait方法定義在Object類(lèi)里面酝润,所有對(duì)象都能用到驻呐,在線程通信中,wait()方法經(jīng)常與notify()和notifyAll()方法一起使用诚纸。

當(dāng)達(dá)到某種狀態(tài)的時(shí)候嘉熊,wait()方法讓線程進(jìn)入等待狀態(tài),比如生產(chǎn)者-消費(fèi)者問(wèn)題中疏咐,當(dāng)隊(duì)列滿了的時(shí)候纤掸,生產(chǎn)者這時(shí)候需要等待,同樣浑塞,當(dāng)隊(duì)列空的時(shí)候借跪,消費(fèi)者也需要等待。

notify()方法用于喚醒正在等待的線程酌壕,這個(gè)線程即將停止等待的狀態(tài)掏愁,比如生產(chǎn)者線程往空隊(duì)列里面增加一個(gè)元素歇由,此時(shí)notify方法會(huì)通知消費(fèi)者線程這個(gè)隊(duì)列不再為空。另外果港,sleep()方法在Java應(yīng)用中用于暫停線程沦泌。

當(dāng)一個(gè)線程不用做其他事了,你可以調(diào)用sleep方法將線程睡眠辛掠,它會(huì)在一定時(shí)間內(nèi)放棄當(dāng)前的CPU資源谢谦。當(dāng)一個(gè)線程已經(jīng)是睡眠狀態(tài)的時(shí)候一段時(shí)間后它會(huì)正常的喚醒,也可以通過(guò)線程中斷的特殊方式將它喚醒公浪。

Java線程中wait和sleep方法的區(qū)別

在最后一部分中我們可以看到什么是wait()和sleep()和它們之間的區(qū)別他宛。正如我之前所說(shuō),除了等待之外欠气,它們是完全不同的:

1)第一個(gè)很重要的區(qū)別就是厅各,wait方法必須正在同步環(huán)境下使用,比如synchronized方法或者同步代碼塊预柒。如果你不在同步條件下使用队塘,會(huì)拋出IllegalMonitorStateException異常。另外宜鸯,sleep方法不需要再同步條件下調(diào)用憔古,你可以任意正常的使用。

2)第二個(gè)區(qū)別是淋袖,wait方法用于和定義于Object類(lèi)的鸿市,而sleep方法操作于當(dāng)前線程,定義在java.lang.Thread類(lèi)里面即碗。

3)第三個(gè)區(qū)別是焰情,調(diào)用wait()的時(shí)候方法會(huì)釋放當(dāng)前持有的鎖,而sleep方法不會(huì)釋放任何鎖剥懒。

4)wait方法最好在循環(huán)里面調(diào)用内舟,是為了處理錯(cuò)誤的通告,比如說(shuō)初橘,即使線程喚醒了验游,等待狀態(tài)仍然適用。(看不懂保檐?大概是循環(huán)里面再判斷一次線程是否真的醒來(lái))耕蝉,然而sleep方法沒(méi)這樣的限制。最好別在循環(huán)里面調(diào)用sleep方法夜只。

下面是關(guān)于調(diào)用wait和sleep方法的代碼片段:

```

synchronized(monitor){

while(condition ==true){monitor.wait())//releases monitor lock

}

Thread.sleep(100);//puts current thread on Sleep

```

5)還有一個(gè)很大的區(qū)別是赔硫,一個(gè)是靜態(tài)方法,一個(gè)不是盐肃。


什么時(shí)候用wait和sleep方法?

從閱讀wait和sleep方法相關(guān)屬性和行為說(shuō)明可以清楚的知道爪膊,wait()方法通常結(jié)合notify()或者notifyAll()方法在兩個(gè)線程通信中使用,而Thread.sleep()方法是個(gè)讓程序或者線程暫停的的工具方法砸王。wait方法的調(diào)用需要同步環(huán)境這個(gè)必要條件才能進(jìn)行推盛,而sleep方法不需要。

完整的總結(jié)一下wait和sleep方法的區(qū)別和不同的使用場(chǎng)景谦铃。一般wait()和notify()方法使用于線程間的通信耘成;sleep()方法用于暫停當(dāng)前線程的執(zhí)行。同時(shí)要注意驹闰,wait()方法會(huì)釋放鎖瘪菌,而sleep()方法會(huì)一直持有鎖(直到睡眠結(jié)束)。所以如果你的設(shè)計(jì)中線程等待需要釋放鎖的話使用wait方法和nofity方法嘹朗,否則使用sleep()方法.


結(jié)尾

第一次翻譯文章师妙,翻譯有點(diǎn)生硬,望見(jiàn)諒屹培,也歡迎指出翻譯不妥之處默穴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市褪秀,隨后出現(xiàn)的幾起案子蓄诽,更是在濱河造成了極大的恐慌,老刑警劉巖媒吗,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仑氛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡闸英,警方通過(guò)查閱死者的電腦和手機(jī)锯岖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)自阱,“玉大人嚎莉,你說(shuō)我怎么就攤上這事∨嫱悖” “怎么了趋箩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)加派。 經(jīng)常有香客問(wèn)我叫确,道長(zhǎng),這世上最難降的妖魔是什么芍锦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任竹勉,我火速辦了婚禮,結(jié)果婚禮上娄琉,老公的妹妹穿的比我還像新娘次乓。我一直安慰自己吓歇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布票腰。 她就那樣靜靜地躺著城看,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杏慰。 梳的紋絲不亂的頭發(fā)上测柠,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音缘滥,去河邊找鬼轰胁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛朝扼,可吹牛的內(nèi)容都是我干的赃阀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吟税,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凹耙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肠仪,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肖抱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后异旧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體意述,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年吮蛹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荤崇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潮针,死狀恐怖术荤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情每篷,我是刑警寧澤瓣戚,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站焦读,受9級(jí)特大地震影響子库,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矗晃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一仑嗅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦仓技、人聲如沸鸵贬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恭理。三九已至,卻和暖如春郭变,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涯保。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工诉濒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夕春。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓未荒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親及志。 傳聞我的和親對(duì)象是個(gè)殘疾皇子片排,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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