Java之sleep和wait的區別

2021-09-07 01:59:09 字數 636 閱讀 4968

這個問題在面試執行緒方面的知識時,基本上屬於必問的問題。因此這裡有必要做乙個較為詳細的總結。

首先需要明白的是這兩個方法根本來自不同的類,sleep來自thread,wait來自object類。

sleep是thread提供的乙個靜態方法,該方法出現在那個執行緒中,那個執行緒就"睡覺",並非是

呼叫該方法的執行緒睡覺,例如a執行緒中呼叫執行緒b.sleep(),a執行緒睡覺。

最為主要的區別是sleep方法沒有釋放「鎖」,而wait方法釋放了"鎖"不然的話就會形成死鎖了。

sleep是不讓出系統資源的;wait是執行緒互動時,如果執行緒a對乙個同步物件x發出乙個wait

呼叫該執行緒會進入執行緒等待池等待,需要等其他執行緒呼叫notify/notifyall喚醒,或者指定的時間過後

自動喚醒。

這裡還需明白一點的就是無論是sleep設定的時間到了,還是wait之後被喚醒了,執行緒並

不一定立即恢復執行,而是觸發"作業系統重新進行一次cpu競爭"。

使用範圍不一樣(將這作為區別略微牽強了)

wait、notify/notifyall必須在同步控制塊、同步方法裡面使用。而sleep的使用在任意地方。

synchronized(x)

**表現上sleep必須捕獲異常,而wait不需捕獲異常。

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則屬於執行緒間通訊。該執行...