sleep(休眠) 和 wait(等待) 方法是 Java 多線程中常用的兩個方法,它們有什麼區別及一些該註意的地方有哪些呢?下麵給大家一一分解。 區別1:使用限制 使用 sleep 方法可以讓讓當前線程休眠,時間一到當前線程繼續往下執行,在任何地方都能使用,但需要捕獲 InterruptedExc ...
sleep(休眠) 和 wait(等待) 方法是 Java 多線程中常用的兩個方法,它們有什麼區別及一些該註意的地方有哪些呢?下麵給大家一一分解。
區別1:使用限制
使用 sleep 方法可以讓讓當前線程休眠,時間一到當前線程繼續往下執行,在任何地方都能使用,但需要捕獲 InterruptedException 異常。
try {
Thread.sleep(3000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
而使用 wait 方法則必須放在 synchronized 塊裡面,同樣需要捕獲 InterruptedException 異常,並且需要獲取對象的鎖。
synchronized (lock){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
而且 wait 還需要額外的方法 notify/ notifyAll 進行喚醒,它們同樣需要放在 synchronized 塊裡面,且獲取對象的鎖。。
synchronized (lock) {
// 隨機喚醒
lock.notify();
// 喚醒全部
lock.notifyAll();
}
當然也可以使用帶時間的 wait(long millis) 方法,時間一到,無需其他線程喚醒,也會重新競爭獲取對象的鎖繼續執行。
區別2:使用場景
sleep 一般用於當前線程休眠,或者輪循暫停操作,wait 則多用於多線程之間的通信。
區別3:所屬類
sleep 是 Thread 類的靜態本地方法,wait 則是 Object 類的本地方法。
java.lang.Thread#sleep
public static native void sleep(long millis) throws InterruptedException;
java.lang.Object#wait
public final native void wait(long timeout) throws InterruptedException;
為什麼要這樣設計呢?
因為 sleep 是讓當前線程休眠,不涉及到對象類,也不需要獲得對象的鎖,所以是線程類的方法。wait 是讓獲得對象鎖的線程實現等待,前提是要楚獲得對象的鎖,所以是類的方法。
區別4:釋放鎖
Object lock = new Object();
synchronized (lock) {
try {
lock.wait(3000L);
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
如上代碼所示,wait 可以釋放當前線程對 lock 對象鎖的持有,而 sleep 則不會。
區別5:線程切換
sleep 會讓出 CPU 執行時間且強制上下文切換,而 wait 則不一定,wait 後可能還是有機會重新競爭到鎖繼續執行的。
@程式猿 你們還知道別的嗎?歡迎留言!
更多乾貨推薦
2.史上最強 Spring Boot & Cloud 教程整理
更多請掃描下方的二維碼關註我們的微信公眾號,乾貨每日推送!