線程中的wait()
和sleep()
有什麼區別? html
我是否知道wait()
ing線程仍處於運行模式並使用CPU週期,可是sleep()
ing不會消耗任何CPU週期正確嗎? java
爲何咱們都 wait()
和sleep()
如何實現他們在一個較低的水平有什麼不一樣? windows
這是一個很是簡單的問題,由於這兩種方法的用法徹底不一樣。 api
主要的區別是等待睡眠時不釋放鎖定或監視器,而等待時不釋聽任何鎖定或監視器。 等待用於線程間通訊,而睡眠用於引入執行暫停。 多線程
這只是一個清晰而基本的解釋,若是您想要的不止這些,請繼續閱讀。 oracle
在的狀況下, wait()
方法的線程進入等待狀態,它會不會回來,直到自動咱們所說的notify()
方法(或notifyAll()
若是你有更多的則處於等待狀態一個線程,並要喚醒全部的這些線程)。 而且您須要同步或對象鎖定或類鎖定來訪問wait()
或notify()
或notifyAll()
方法。 還有一點, wait()
方法用於線程間通訊,由於若是線程進入等待狀態,則須要另外一個線程來喚醒該線程。 編碼
可是在sleep()
狀況下,這是一種用於將進程保留幾秒鐘或所需時間的方法。 由於您不須要激發任何notify()
或notifyAll()
方法來獲取該線程。 或者,您不須要任何其餘線程來回調該線程。 就像若是您但願某事在幾秒鐘後發生,例如在用戶回合以後在遊戲中發生同樣,您但願用戶等到計算機播放後,即可以說起sleep()
方法。 spa
還有一個在採訪中常常問到的重要差別: sleep()
屬於Thread
類,而wait()
屬於Object
類。 操作系統
這些都是sleep()
和wait()
之間的區別。 線程
這兩種方法之間有一個類似之處:它們都是被檢查的語句,所以您須要嘗試catch或throws來訪問這些方法。
我但願這能幫到您。
這裏有不少答案,可是我找不到任何提到的語義區別。
它與線程自己無關; 這兩種方法都是必需的,由於它們支持很是不一樣的用例。
sleep()
使線程像之前同樣進入睡眠狀態,它只是打包上下文並在預約的時間內中止執行。 所以,爲了在適當的時間以前將其喚醒,您須要瞭解線程引用。 這在多線程環境中並不常見。 它主要用於時間同步(例如,在3.5秒內準確喚醒)和/或硬編碼的公平性(只需睡眠一下子,而後讓其餘線程工做)。
相反, wait()
是線程(或消息)同步機制,它使您能夠通知沒有存儲引用的線程(也沒必要擔憂)。 您能夠將其視爲發佈-訂閱模式( wait
== subscription和notify()
== publish)。 基本上,使用notify()能夠發送一條消息(甚至可能根本沒有收到,一般您不在意)。
綜上所述,一般將sleep()
用於時間同步,將wait()
用於多線程同步。
它們能夠在底層操做系統中以相同的方式實現,也能夠根本不實現(由於Java的早期版本沒有真正的多線程;可能某些小型VM也不這樣作)。 不要忘記Java在VM上運行,所以您的代碼將根據其運行的VM / OS / HW進行不一樣的轉換。
一個wait
能夠「喚醒」被另外一個線程調用notify
,其正在上而等待在監視器上sleep
不了。 一樣,必須在監視對象上synchronized
的塊中發生wait
(並notify
),而sleep
不會:
Object mon = ...; synchronized (mon) { mon.wait(); }
此時,當前正在執行的線程將等待並釋放監視器 。 另外一個線程可能會作
synchronized (mon) { mon.notify(); }
(在同一mon
對象上),第一個線程(假設它是監視器上等待的惟一線程)將喚醒。
若是監視器上有多個線程在等待,您還能夠調用notifyAll
-這將喚醒全部線程。 可是,只有一個線程將可以抓住監視器(記住wait
在synchronized
塊中)並繼續執行-而後其餘線程將被阻塞,直到它們得到監視器的鎖爲止。
另外一點是,您在Object
自己上調用wait
(即,在對象的監視器上等待),而在Thread
上調用sleep
。
還有一點是,您能夠從wait
獲得虛假的喚醒(即,正在等待的線程無端恢復運行)。 在如下狀況下 ,您應該始終wait
旋轉 :
synchronized { while (!condition) { mon.wait(); } }
簡單來講,wait是等待,直到其餘線程調用您,而sleep是在指定的時間段內「不執行下一條語句」。
此外,sleep是Thread類中的靜態方法,它在線程上運行,而wait()在Object類中,而且在對象上調用。
還有一點,當您在某個對象上調用wait時,所涉及的線程將同步該對象,而後進行等待。 :)
wait
和sleep
方法很是不一樣:
仔細想一想,名字在這方面使人困惑; 可是, sleep
是標準名稱,而wait
就像Win API中的WaitForSingleObject
或WaitForMultipleObjects
同樣。