1. 程式人生 > >sleep( ) 和 wait( ) 的騰訊分分彩原始碼下載這 5 個區別,你知道幾個?

sleep( ) 和 wait( ) 的騰訊分分彩原始碼下載這 5 個區別,你知道幾個?

sleep(休眠) 和 wait(等待) 騰訊分分彩原始碼下載  dsluntan.com Q:3393756370 VX:17061863513方法是 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:執行緒切換 歡迎工作一到五年的Java工程師朋友們加入Java群: 891219277
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

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