Java中wait和sleep方法的區別

2021-08-18 10:19:45 字數 1456 閱讀 2677

如果執行緒a希望立即結束執行緒b,則可以對執行緒b對應的thread例項呼叫interrupt方法。如果此刻執行緒b正在wait/sleep/join,則執行緒b會立刻丟擲interruptedexception,在catch() {} 中直接return即可安全地結束執行緒。

需要注意的是,interruptedexception是執行緒自己從內部丟擲的,並不是interrupt()方法丟擲的。對某一線程呼叫interrupt()時,如果該執行緒正在執行普通的**,那麼該執行緒根本就不會丟擲interruptedexception。但是,一旦該執行緒進入到wait()/sleep()/join()後,就會立刻丟擲interruptedexception。

waite()和notify()因為會對物件的「鎖標誌」進行操作,所以它們必須在synchronized函式或synchronized block中進行呼叫。如果在non-synchronized函式或non-synchronizedblock中進行呼叫,雖然能編譯通過,但在執行時會發生illegalmonitorstateexception的異常。

補充兩個重要的方法:yield()和join()

yield方法  

暫停當前正在執行的執行緒物件。  

yield()方法是停止當前執行緒,讓同等優先權的執行緒或更高優先順序的執行緒有執行的機會。如果沒有的話,那麼yield()方法將不會起作用,並且由可執行狀態後馬上又被執行。

join方法是用於在某乙個執行緒的執行過程中呼叫另乙個執行緒執行,等到被呼叫的執行緒執行結束後,再繼續執行當前執行緒。如:t.join();//主要用於等待t執行緒執行結束,若無此句,main則會執行完畢,導致結果不可**。  

while(!執行條件) 

....

if(!執行條件)

....

while會一直執行迴圈,直到條件滿足,執行條件才會繼續往下執行。if只會執行一次判斷條件,不滿足就會等待。這樣就會出現問題。

我們知道用notify() 和notifyall()可以喚醒執行緒,一般我們常用的是notifyall(),因為notify(),只會隨機喚醒乙個睡眠執行緒,並不一定是我們想要喚醒的執行緒。如果使用的是notifyall(),喚醒所有的執行緒,那你怎麼知道他想喚醒的是某個正在等待的wait()執行緒呢,如果用while()方法,就會再次判斷條件是不是成立,滿足執行條件了,就會接著執行,而if會直接喚醒wait()方法,繼續往下執行,根本不管這個notifyall()是不是想喚醒的是自己還是別人,可能此時if的條件根本沒成立。

舉個例子:

while去水果店買蘋果,沒有了,然後while就和水果店老闆說,有水果的時候通知我,我先回去了。if也去水果店買蘋果,沒有了,然後if就和水果店老闆說,有水果的時候通知我,我先回去了。過一段時間,水果店老闆發簡訊告訴while和if,有水果了,while去一看,水果店只是進了香蕉,並不是蘋果,所以不是想要的水果,於是回去繼續等水果店老闆通知,而if根本就不看是不是自己想要的蘋果,直接就叫老闆送10斤水果過來,這樣會導致你得到錯誤的結果。

java中wait 和 sleep 區別

1,wait可以指定時間也可以不指定。sleep必須指定時間。2,在同步中時,對cpu的執行權和鎖的處理不同。wait 釋放執行權,釋放鎖。sleep 釋放執行權,不釋放鎖。public class test1 class mythread extends thread override publi...

Java中wait和sleep區別

super類不同 對於sleep 方法是屬於thread類,而wait 方法,則是屬於object類。是否釋放執行緒鎖 在呼叫sleep 方法的過程中,執行緒不會釋放物件鎖。而當呼叫wait 方法的時候,執行緒會放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件呼叫notify 方法後本執行緒才...

關於JAVA中sleep和wait

腦殼疼,今天傍晚看到sleep和wait時,頭腦中的概念也的確是模糊不清,然後又是一頓搜尋,明白了不少。1.sleep 是屬於thread類,而wait是屬於object類的且必須和notify或notifyall 一起搭配使用。sleep是執行緒控制自身的流程,而wait則屬於執行緒間通訊。該執行...