sleep 和 wait 的區別

2021-09-25 01:49:43 字數 1413 閱讀 3423

sleep:thread類中定義的方法,表示執行緒休眠,會自動喚醒;導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復。呼叫sleep不會釋放物件鎖。sleep就是正在執行的執行緒主動讓出cpu,cpu去執行其他執行緒,在sleep指定的時間過後,cpu才會回到這個執行緒上繼續往下執行,如果當前執行緒進入了同步鎖,sleep方法並不會釋放鎖,即使當前執行緒使用sleep方法讓出了cpu,但其他被同步鎖擋住了的執行緒也無法得到執行。

wait:object中定義的方法,需要手工呼叫notify()或者notifyall()方法。對此物件呼叫wait方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發出notify方法(或notifyall)後本執行緒才進入物件鎖定池準備獲得物件鎖進入執行狀態。wait是指在乙個已經進入了同步鎖的執行緒內,讓自己暫時讓出同步鎖,以便其他正在等待此鎖的執行緒可以得到同步鎖並執行,只有其他執行緒呼叫了notify方法(notify並不釋放鎖,只是告訴呼叫過wait方法的執行緒可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因為鎖還在別人手裡,別人還沒釋放。如果notify方法後面的**還有很多,需要這些**執行完後才會釋放鎖,可以在notfiy方法後增加乙個等待和一些**,看看效果),呼叫wait方法的執行緒就會解除wait狀態和程式可以再次得到鎖後繼續向下執行。對於wait的講解一定要配合例子**來說明,才顯得自己真明白。

主要有以下幾點區別:

1、使用限制:

使用 sleep 方法可以讓讓當前執行緒休眠,時間一到當前執行緒繼續往下執行,在任何地方都能使用,但需要捕獲 interruptedexception 異常。

而使用 wait 方法則必須放在 synchronized 塊裡面,同樣需要捕獲 interruptedexception 異常,並且需要獲取物件的鎖。

而且 wait 還需要額外的方法notify/ notifyall 進行喚醒,它們同樣需要放在 synchronized 塊裡面,且獲取物件的鎖。

2、使用場景:sleep一般用於當前執行緒休眠,或者輪循暫停操作,wait則多用於多執行緒之間的通訊。

3、所屬類:sleep是 thread 類的靜態本地方法,wait 則是 object 類的本地方法。

4、釋放鎖:wait 可以釋放當前執行緒對 lock 物件鎖的持有,而 sleep 則不會,如下圖:

5、執行緒切換:sleep 會讓出 cpu 執行時間且強制上下文切換,而 wait 則不一定,wait 後可能還是有機會重新競爭到鎖繼續執行的。

sleep和wait的區別

關鍵字 sleep wait 1 這兩個方法來自不同的類分別是thread和object 2 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。3 wait,notify和notifyall只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在...

sleep 和 wait的區別

1 這兩個方法來自不同的類分別是,sleep來自thread類,和wait來自object類。sleep是thread的靜態類方法,誰呼叫的誰去睡覺,即使在a執行緒裡呼叫了b的sleep方法,實際上還是a去睡覺,要讓b執行緒睡覺要在b的 中呼叫sleep。2 最主要是sleep方法沒有釋放鎖,而wa...

sleep和wait的區別

1 這兩個方法來自不同的類分別是,sleep來自thread類,和wait來自object類。sleep是thread的靜態類方法,誰呼叫的誰去睡覺,即使在a執行緒裡呼叫了b的sleep方法,實際上還是a去睡覺,要讓b執行緒睡覺要在b的 中呼叫sleep。2 最主要是sleep方法沒有釋放鎖,而wa...