1. 程式人生 > 實用技巧 >wait/notify 和 sleep 方法的異同

wait/notify 和 sleep 方法的異同

相同點:
它們都可以讓執行緒阻塞。
它們都可以響應interrupt中斷:在等待的過程中如果收到中斷訊號,都可以進行響應,並丟擲 InterruptedException 異常。


不同點:
wait 方法必須在 synchronized保護的程式碼中使用,而 sleep方法並沒有這個要求。
在同步程式碼中執行 sleep 方法時,並不會釋放 monitor 鎖,但執行 wait 方法時會主動釋放 monitor 鎖。
sleep 方法中會要求必須定義一個時間,時間到期後會主動恢復,而對於沒有引數的wait 方法而言,意味著永久等待,直到被中斷或被喚醒才能恢復,它並不會主動恢復。
wait/notify 是 Object 類的方法,而 sleep 是 Thread 類的方法。

synchronized的用法:

publicvoidgive(Stringdata){
synchronized(this){
buffer.add(data);
notify();
 }
}

publicStringtake()throwsInterruptedException{
synchronized(this){
while(buffer.isEmpty()){
wait();
}
returnbuffer.remove();
 }
}

ref:

拉勾課程徐隆曦 《Java 併發程式設計 78 講》