wait/notify 和 sleep 方法的異同
阿新 • • 發佈:2020-06-27
相同點:
它們都可以讓執行緒阻塞。
它們都可以響應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 講》