wait()和sleep()之間的區別

線程中的wait()sleep()有什麼區別? html

我是否知道wait() ing線程仍處於運行模式並使用CPU週期,可是sleep() ing不會消耗任何CPU週期正確嗎? java

爲何咱們 wait()sleep()如何實現他們在一個較低的水平有什麼不一樣? windows


#1樓

這是一個很是簡單的問題,由於這兩種方法的用法徹底不一樣。 api

主要的區別是等待睡眠時不釋放鎖定或監視器,而等待時不釋聽任何鎖定或監視器。 等待用於線程間通訊,而睡眠用於引入執行暫停。 多線程

這只是一個清晰而基本的解釋,若是您想要的不止這些,請繼續閱讀。 oracle

在的狀況下, wait()方法的線程進入等待狀態,它會不會回來,直到自動咱們所說的notify()方法(或notifyAll()若是你有更多的則處於等待狀態一個線程,並要喚醒全部的這些線程)。 而且您須要同步或對象鎖定或類鎖定來訪問wait()notify()notifyAll()方法。 還有一點, wait()方法用於線程間通訊,由於若是線程進入等待狀態,則須要另外一個線程來喚醒該線程。 編碼

可是在sleep()狀況下,這是一種用於將進程保留幾秒鐘或所需時間的方法。 由於您不須要激發任何notify()notifyAll()方法來獲取該線程。 或者,您不須要任何其餘線程來回調該線程。 就像若是您但願某事在幾秒鐘後發生,例如在用戶回合以後在遊戲中發生同樣,您但願用戶等到計算機播放後,即可以說起sleep()方法。 spa

還有一個在採訪中常常問到的重要差別: sleep()屬於Thread類,而wait()屬於Object類。 操作系統

這些都是sleep()wait()之間的區別。 線程

這兩種方法之間有一個類似之處:它們都是被檢查的語句,所以您須要嘗試catch或throws來訪問這些方法。

我但願這能幫到您。


#2樓

這裏有不少答案,可是我找不到任何提到的語義區別。

它與線程自己無關; 這兩種方法都是必需的,由於它們支持很是不一樣的用例。

sleep()使線程像之前同樣進入睡眠狀態,它只是打包上下文並在預約的時間內中止執行。 所以,爲了在適當的時間以前將其喚醒,您須要瞭解線程引用。 這在多線程環境中並不常見。 它主要用於時間同步(例如,在3.5秒內準確喚醒)和/或硬編碼的公平性(只需睡眠一下子,而後讓其餘線程工做)。

相反, wait()是線程(或消息)同步機制,它使您能夠通知沒有存儲引用的線程(也沒必要擔憂)。 您能夠將其視爲發佈-訂閱模式( wait == subscription和notify() == publish)。 基本上,使用notify()能夠發送一條消息(甚至可能根本沒有收到,一般您不在意)。

綜上所述,一般將sleep()用於時間同步,將wait()用於多線程同步。

它們能夠在底層操做系統中以相同的方式實現,也能夠根本不實現(由於Java的早期版本沒有真正的多線程;可能某些小型VM也不這樣作)。 不要忘記Java在VM上運行,所以您的代碼將根據其運行的VM / OS / HW進行不一樣的轉換。


#3樓

一個wait能夠「喚醒」被另外一個線程調用notify ,其正在上而等待在監視器上sleep不了。 一樣,必須在監視對象上synchronized的塊中發生wait (並notify ),而sleep不會:

Object mon = ...;
synchronized (mon) {
    mon.wait();
}

此時,當前正在執行的線程將等待並釋放監視器 。 另外一個線程可能會作

synchronized (mon) { mon.notify(); }

(在同一mon對象上),第一個線程(假設它是監視器上等待的惟一線程)將喚醒。

若是監視器上有多個線程在等待,您還能夠調用notifyAll -這將喚醒全部線程。 可是,只有一個線程將可以抓住監視器(記住waitsynchronized塊中)並繼續執行-而後其餘線程將被阻塞,直到它們得到監視器的鎖爲止。

另外一點是,您在Object自己上調用wait (即,在對象的監視器上等待),而在Thread上調用sleep

還有一點是,您能夠從wait獲得虛假的喚醒(即,正在等待的線程無端恢復運行)。 如下狀況下 ,您應該始終wait旋轉

synchronized {
    while (!condition) { mon.wait(); }
}

#4樓

簡單來講,wait是等待,直到其餘線程調用您,而sleep是在指定的時間段內「不執行下一條語句」。

此外,sleep是Thread類中的靜態方法,它在線程上運行,而wait()在Object類中,而且在對象上調用。

還有一點,當您在某個對象上調用wait時,所涉及的線程將同步該對象,而後進行等待。 :)


#5樓

waitsleep方法很是不一樣:

  • sleep沒法「喚醒」,
  • wait在等待期間能夠經過另外一個線程調用notifynotifyAll來「喚醒」。

仔細想一想,名字在這方面使人困惑; 可是, sleep是標準名稱,而wait就像Win API中的WaitForSingleObjectWaitForMultipleObjects同樣。

相關文章
相關標籤/搜索