java wait 和sleep 方法之經驗談

2021-07-22 03:06:42 字數 1084 閱讀 6419

(

sleep 是執行緒類(thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復。呼叫sleep 不會釋放物件鎖。

wait 是object 類的方法,對此物件呼叫wait 方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發出notify 方法(或notifyall)後本執行緒才進入物件鎖定池準備獲得物件鎖進入執行狀態。

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

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

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

synchronized(x)

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()方法而產生

Java wait和notify結合使用

1 示例 public class testsyncro2 thread t2 new thread new runnable t1.start t2.start class customer catch exception ex this.amount amount system.out.prin...

Thread的sleep方法和wait方法的區別

1.sleep和wait都是使執行緒暫時停止執行的方法,但它們有很大的不同,sleep是執行緒類thread的方法,它是使當前執行緒暫時睡眠,可以放在任何位置。而wait是object類的方法,它是使當前執行緒暫時放棄物件的使用權進行等待,必須放在同步方法或同步塊裡。2.sleep使用的時候,執行緒...

魔術方法 sleep 和

感覺序列化和反序列化用得倒是比較少了,而json encode和json decode用得相對多,都是轉化成串,進行入庫 傳輸等。json更方便,但是序列化和反序列化結合這兩個魔術方法使用倒還行 魔術方法 sleep 和 wakeup sleep serialize 序列化之前呼叫,返回乙個需要儲存...