Java 中 wait、sleep 和 yield 的區(qū)別

wait

  • wait 是 Object 類(lèi)的實(shí)例方法,用于線程間通信
  • wait() 方法導(dǎo)致當(dāng)前線程進(jìn)入等待狀態(tài)并釋放對(duì)象的鎖,直到它被通知(其他線程調(diào)用 notify 或 notifyAll 方法。notify / notifyAll 方法解除等待線程的阻塞狀態(tài))
  • wait(long timeout) 方法導(dǎo)致當(dāng)前線程釋放對(duì)象的鎖,并進(jìn)入等待狀態(tài)直到它被通知或者經(jīng)過(guò)指定的時(shí)間
  • wait() 和 wait(long timeout) 被喚醒后會(huì)進(jìn)入阻塞狀態(tài)(Blocked),直到獲得鎖,才進(jìn)入就緒態(tài)(Runnable)
  • wait() 方法只能在同步方法或同步代碼塊中調(diào)用。如果當(dāng)前線程不是對(duì)象鎖的持有者,該方法拋出一個(gè) IllegalMonitorStateException 異常
  • 可以通過(guò) interrupt() 方法打斷線程的暫停狀態(tài),從而使線程立刻拋出 InterruptedException(但不建議使用該方法),被 interrupt 以后會(huì)釋放鎖
  • 不需要捕獲異常

sleep

  • sleep 是 Thread 類(lèi)的靜態(tài)方法,作用是阻塞當(dāng)前線程,讓出 CPU 的使用
  • 用于短時(shí)間暫停當(dāng)前線程
  • sleep(long millis) 使當(dāng)前線程進(jìn)入停滯狀態(tài),所以執(zhí)行 sleep() 的線程在指定的時(shí)間內(nèi)肯定不會(huì)被執(zhí)行
  • sleep(long millis) 可能使任意優(yōu)先級(jí)的其他線程得到執(zhí)行機(jī)會(huì)
  • sleep(long millis) 不會(huì)釋放鎖
  • 調(diào)用 sleep 方法的線程在喚醒之后不保證能獲取到 CPU,它會(huì)先進(jìn)入就緒態(tài)(Runnable),與其他線程競(jìng)爭(zhēng) CPU
  • 可以通過(guò) interrupt() 方法打斷線程的暫停狀態(tài),從而使線程立刻拋出 InterruptedException(但不建議使用該方法),被 interrupt 以后會(huì)釋放鎖
  • 需要捕獲異常
/**
 * Thread sleep和wait區(qū)別
 */
public class ThreadTest implements Runnable {
    int number = 10;

    public void firstMethod() throws Exception {
        synchronized (this) {
            number += 100;
            System.out.println(number);
        }
    }

    public void secondMethod() throws Exception {
        synchronized (this) {
            /**
             * (休息 2s,阻塞線程)
             * 以驗(yàn)證當(dāng)前線程對(duì)象的機(jī)鎖被占用時(shí),
             * 是否被可以訪問(wèn)其他同步代碼塊
             */
            Thread.sleep(2000);
            // this.wait(2000);
            number *= 200;
        }
    }

    @Override
    public void run() {
        try {
            firstMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadTest threadTest = new ThreadTest();
        Thread thread = new Thread(threadTest);
        thread.start();
        threadTest.secondMethod();
    }
}

運(yùn)行結(jié)果:

Thread.sleep(2000): 2100
this.wait(2000): 110

yield

  • yield 是 Thread 類(lèi)的靜態(tài)方法,沒(méi)有參數(shù),使當(dāng)前線程從運(yùn)行狀態(tài)變?yōu)榫途w態(tài)
  • yield 方法使當(dāng)前線程讓出 CPU,但讓出的時(shí)間是不可設(shè)定的
  • yield 方法不會(huì)釋放鎖
  • yield 會(huì)把 CPU 讓給相同優(yōu)先級(jí)的其他線程,而不會(huì)把 CPU 給更高或更低優(yōu)先級(jí)的其他線程。若此時(shí)沒(méi)有其他線程跟它在有一個(gè)優(yōu)先級(jí),則該線程繼續(xù)獲得 CPU 時(shí)間,因此可能某線程剛調(diào)用 yield 方法又馬上被執(zhí)行
  • 不需要捕獲異常
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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