欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java面試突擊之sleep和wait有什么區(qū)別詳析

 更新時間:2022年02月23日 09:44:03   作者:Java中文社群  
按理來說sleep和wait本身就是八竿子打不著的兩個東西,但是在實際使用中大家都喜歡拿他們來做比較,或許是因為它們都可以讓線程處于阻塞狀態(tài),這篇文章主要給大家介紹了關(guān)于java面試突擊之sleep和wait有什么區(qū)別的相關(guān)資料,需要的朋友可以參考下

前言

sleep 方法和 wait 方法都是用來將線程進入休眠狀態(tài)的,并且 sleep 和 wait 方法都可以響應(yīng) interrupt 中斷,也就是線程在休眠的過程中,如果收到中斷信號,都可以進行響應(yīng),并拋出 InterruptedException 異常。那 sleep 和 wait 的區(qū)別都有哪些呢?接下來,我們一起來看。

區(qū)別一:語法使用不同

wait 方法必須配合 synchronized 一起使用,不然在運行時就會拋出 IllegalMonitorStateException 的異常,如下代碼所示:

初看代碼好像沒啥問題,編譯器也沒報錯,然而當(dāng)我們運行以上程序時就會發(fā)生如下錯誤:

而 sleep 可以單獨使用,無需配合 synchronized 一起使用。

區(qū)別二:所屬類不同

wait 方法屬于 Object 類的方法,而 sleep 屬于 Thread 類的方法,如下圖所示:

區(qū)別三:喚醒方式不同

sleep 方法必須要傳遞一個超時時間的參數(shù),且過了超時時間之后,線程會自動喚醒。而 wait 方法可以不傳遞任何參數(shù),不傳遞任何參數(shù)時表示永久休眠,直到另一個線程調(diào)用了 notify 或 notifyAll 之后,休眠的線程才能被喚醒。也就是說 sleep 方法具有主動喚醒功能,而不傳遞任何參數(shù)的 wait 方法只能被動的被喚醒。

區(qū)別四:釋放鎖資源不同

wait 方法會主動的釋放鎖,而 sleep 方法則不會。接下來我們使用代碼的方式來演示一下二者的區(qū)別。

sleep 不釋放鎖

接下來使用 sleep 是線程休眠 2s,然后在另一個線程中嘗試獲取公共鎖,如果能夠獲取到鎖,則說明 sleep 在休眠時會釋放鎖,反之則說明不會釋放鎖,實現(xiàn)代碼如下:

public static void main(String[] args) throws InterruptedException {
    Object lock = new Object();
    new Thread(() -> {
        synchronized (lock) {
            System.out.println("新線程獲取到鎖:" + LocalDateTime.now());
            try {
                // 休眠 2s
                Thread.sleep(2000);
                System.out.println("新線程獲釋放鎖:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
    // 等新線程先獲得鎖
    Thread.sleep(200);
    System.out.println("主線程嘗試獲取鎖:" + LocalDateTime.now());
    // 在新線程休眠之后,嘗試獲取鎖
    synchronized (lock) {
        System.out.println("主線程獲取到鎖:" + LocalDateTime.now());
    }
}

以上代碼的執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果可以看出,在調(diào)用了 sleep 之后,在主線程里嘗試獲取鎖卻沒有成功,只有 sleep 執(zhí)行完之后釋放了鎖,主線程才正常的得到了鎖,這說明 sleep 在休眠時并不會釋放鎖。

wait 釋放鎖

接下來使用同樣的方式,將 sleep 替換成 wait,在線程休眠之后,在另一個線程中嘗試獲取鎖,實現(xiàn)代碼如下:

public static void main(String[] args) throws InterruptedException {
    Object lock = new Object();
    new Thread(() -> {
        synchronized (lock) {
            System.out.println("新線程獲取到鎖:" + LocalDateTime.now());
            try {
                // 休眠 2s
                lock.wait(2000);
                System.out.println("新線程獲釋放鎖:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
    // 等新線程先獲得鎖
    Thread.sleep(200);
    System.out.println("主線程嘗試獲取鎖:" + LocalDateTime.now());
    // 在新線程休眠之后,嘗試獲取鎖
    synchronized (lock) {
        System.out.println("主線程獲取到鎖:" + LocalDateTime.now());
    }
}

以上代碼的執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果可以看出,當(dāng)調(diào)用了 wait 之后,主線程立馬嘗試獲取鎖成功了,這就說明 wait 休眠時是釋放鎖的。

區(qū)別五:線程進入狀態(tài)不同

調(diào)用 sleep 方法線程會進入 TIMED_WAITING 有時限等待狀態(tài),而調(diào)用無參數(shù)的 wait 方法,線程會進入 WAITING 無時限等待狀態(tài)。代碼演示:

public static void main(String[] args) throws InterruptedException {
    Object lock = new Object();
    Thread t1 = new Thread(() -> {
        synchronized (lock) {
            try {
                // 休眠 2s
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    t1.start();

    Thread t2 = new Thread(() -> {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    t2.start();

    Thread.sleep(200);
    System.out.println("wait() 之后進入狀態(tài):" + t1.getState());
    System.out.println("sleep(2000) 之后進入狀態(tài):" + t2.getState());

}

以上代碼的執(zhí)行結(jié)果如下:

總結(jié)

sleep 和 wait 都可以讓線程進入休眠狀態(tài),并且它們都可以響應(yīng) interrupt 中斷,但二者的區(qū)別主要體現(xiàn)在:語法使用不同、所屬類不同、喚醒方式不同、釋放鎖不同和線程進入的狀態(tài)不同。

到此這篇關(guān)于java面試突擊之sleep和wait區(qū)別的文章就介紹到這了,更多相關(guān)java sleep和wait區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis創(chuàng)建逆向工程的步驟

    Mybatis創(chuàng)建逆向工程的步驟

    Mybatis逆向工程是一個自動生成Mybatis Mapper接口、XML文件和Java實體類的工具,可以提高開發(fā)效率,避免手動編寫大量的重復(fù)代碼,本文主要介紹了Mybatis創(chuàng)建逆向工程的步驟,感興趣的可以了解一下
    2023-10-10
  • spring監(jiān)視器actuator配置應(yīng)用

    spring監(jiān)視器actuator配置應(yīng)用

    這篇文章主要介紹了spring監(jiān)視器actuator配置應(yīng)用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Mybatis generator的使用全面解析

    Mybatis generator的使用全面解析

    這篇文章主要介紹了Mybatis generator的使用,非常不錯,具有參考借鑒價值,對mybatis generator的使用相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-09-09
  • Java編寫實現(xiàn)登陸窗口

    Java編寫實現(xiàn)登陸窗口

    這篇文章主要為大家詳細介紹了Java編寫實現(xiàn)登陸窗口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot之groups應(yīng)對不同的Validation規(guī)則自定義方式

    SpringBoot之groups應(yīng)對不同的Validation規(guī)則自定義方式

    這篇文章主要介紹了SpringBoot之groups應(yīng)對不同的Validation規(guī)則自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java socket實現(xiàn)聊天室 java實現(xiàn)多人聊天功能

    java socket實現(xiàn)聊天室 java實現(xiàn)多人聊天功能

    這篇文章主要為大家詳細介紹了java socket實現(xiàn)聊天室,java實現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 淺談線程的幾種可用狀態(tài)

    淺談線程的幾種可用狀態(tài)

    下面小編就為大家?guī)硪黄獪\談線程的幾種可用狀態(tài)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Maven通過filtering標簽讀取變量配置的三種方法

    Maven通過filtering標簽讀取變量配置的三種方法

    在日常開發(fā)中,我們大多都會有開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境等,不同環(huán)境的參數(shù)肯定不一樣,本文主要介紹了Maven通過filtering標簽讀取變量配置的三種方法,感興趣的可以了解一下
    2024-03-03
  • Java中性能優(yōu)化的35種方法匯總

    Java中性能優(yōu)化的35種方法匯總

    很多同學(xué)在日常寫Java的時候很少去關(guān)心性能問題,但是在我們寫代碼的過程中必須考慮到性能對程序的影響。小到我們使用位運算來實現(xiàn)算術(shù)運算,大到我們對 Java 代碼的總體架構(gòu)設(shè)計,性能其實離我們很近。本文介紹了Java中性能優(yōu)化的35種方法,需要的朋友可以參考下。
    2017-01-01
  • java中this的用法示例(關(guān)鍵字this)

    java中this的用法示例(關(guān)鍵字this)

    這篇文章主要介紹了java中this的用法示例(關(guān)鍵字this),需要的朋友可以參考下
    2014-03-03

最新評論