wait與sleep的區(qū)別

wait和sleep是java多線程中常用的兩個方法,下面看一看兩者之間到底有什么區(qū)別。

1. 使用限制

使用 sleep 方法可以讓讓當(dāng)前線程休眠,時間一到當(dāng)前線程繼續(xù)往下執(zhí)行,在任何地方都能使用,但需要捕獲 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 進(jìn)行喚醒,它們同樣需要放在 synchronized 塊里面,且獲取對象的鎖。。

synchronized (lock) {
    // 隨機(jī)喚醒
    lock.notify();
    
    // 喚醒全部
    lock.notifyAll();
}

當(dāng)然也可以使用帶時間的 wait(long millis) 方法,時間一到,無需其他線程喚醒,也會重新競爭獲取對象的鎖繼續(xù)執(zhí)行。

2. 使用場景

sleep 一般用于當(dāng)前線程休眠,或者輪循暫停操作,wait 則多用于多線程之間的通信。

3. 所屬類

sleep是Thread類的靜態(tài)本地方法,wait是Object類的本地方法
sleep是讓當(dāng)前線程休眠,不涉及到對象類以及對象類的鎖。wait是讓獲得到對象鎖的線程實(shí)現(xiàn)等待,所以是類的方法

4. 釋放鎖

Object lock = new Object();
synchronized (lock) {
    try {
        lock.wait(3000L);
        Thread.sleep(2000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

wait會釋放當(dāng)前線程對lock對象持有的鎖,而sleep則不會。

5. 線程切換

sleep 會讓出 CPU 執(zhí)行時間且強(qiáng)制上下文切換,而 wait 則不一定,wait 后可能還是有機(jī)會重新競爭到鎖繼續(xù)執(zhí)行的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容