Java中wait和sleep方法的區別

2021-09-12 02:14:07 字數 1188 閱讀 4985

1.這兩個方法來自不同的類分別是thread和object

2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法(鎖**塊和方法鎖)。

3.(使用範圍)wait,notify和notifyall只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用

4.sleep必須捕獲異常,而wait,notify和notifyall不需要捕獲異常

sleep方法屬於thread類中方法,表示讓乙個執行緒進入睡眠狀態,等待一定的時間之後,自動醒來進入到可執行狀態,不會馬上進入執行狀態,因為執行緒排程機制恢復執行緒的執行也需要時間,乙個執行緒物件呼叫了sleep方法之後,並不會釋放他所持有的所有物件鎖,所以也就不會影響其他程序物件的執行。但在sleep的過程中過程中有可能被其他物件呼叫它的interrupt(),產生interruptedexception異常,如果你的程式不捕獲這個異常,執行緒就會異常終止,進入terminated狀態,如果你的程式捕獲了這個異常,那麼程式就會繼續執行catch語句塊(可能還有finally語句塊)以及以後的**。

注意sleep()方法是乙個靜態方法,也就是說他只對當前物件有效,通過t.sleep()讓t物件進入sleep,這樣的做法是錯誤的,它只會是使當前執行緒被sleep 而不是t執行緒

wait屬於object的成員方法,一旦乙個物件呼叫了wait方法,必須要採用notify()和notifyall()方法喚醒該程序;如果執行緒擁有某個或某些物件的同步鎖,那麼在呼叫了wait()後,這個執行緒就會釋放它持有的所有同步資源,而不限於這個被呼叫了wait()方法的物件。wait()方法也同樣會在wait的過程中有可能被其他物件呼叫interrupt()方法而產生

5.同時wait一般和while連用

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

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

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