最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

wait 方法必須配合 synchronized 一起使用,不然在運(yùn)行時(shí)就會(huì)拋出 IllegalMonitorStateException 的異常,如下代碼所示:

初看代碼好像沒啥問題,編譯器也沒報(bào)錯(cuò),然而當(dāng)我們運(yùn)行以上程序時(shí)就會(huì)發(fā)生如下錯(cuò)誤:

而 sleep 可以單獨(dú)使用,無(wú)需配合 synchronized 一起使用。

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

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

區(qū)別三:?jiǎn)拘逊绞讲煌?/h2>

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

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

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

sleep 不釋放鎖

接下來(lái)使用 sleep 是線程休眠 2s,然后在另一個(gè)線程中嘗試獲取公共鎖,如果能夠獲取到鎖,則說(shuō)明 sleep 在休眠時(shí)會(huì)釋放鎖,反之則說(shuō)明不會(huì)釋放鎖,實(shí)現(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í)行完之后釋放了鎖,主線程才正常的得到了鎖,這說(shuō)明 sleep 在休眠時(shí)并不會(huì)釋放鎖。

wait 釋放鎖

接下來(lái)使用同樣的方式,將 sleep 替換成 wait,在線程休眠之后,在另一個(gè)線程中嘗試獲取鎖,實(shí)現(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 之后,主線程立馬嘗試獲取鎖成功了,這就說(shuō)明 wait 休眠時(shí)是釋放鎖的。

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

調(diào)用 sleep 方法線程會(huì)進(jìn)入 TIMED_WAITING 有時(shí)限等待狀態(tài),而調(diào)用無(wú)參數(shù)的 wait 方法,線程會(huì)進(jìn)入 WAITING 無(wú)時(shí)限等待狀態(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() 之后進(jìn)入狀態(tài):" + t1.getState());
    System.out.println("sleep(2000) 之后進(jìn)入狀態(tài):" + t2.getState());

}

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

總結(jié)

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

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

相關(guān)文章

  • java利用多線程和Socket實(shí)現(xiàn)猜拳游戲

    java利用多線程和Socket實(shí)現(xiàn)猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了java利用多線程和Socket實(shí)現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Spring Boot實(shí)現(xiàn)異步請(qǐng)求(Servlet 3.0)

    Spring Boot實(shí)現(xiàn)異步請(qǐng)求(Servlet 3.0)

    在spring 3.2 及以后版本中增加了對(duì)請(qǐng)求的異步處理,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)異步請(qǐng)求(Servlet 3.0),感興趣的小伙伴們可以參考一下。
    2017-04-04
  • SpringBoot配置系統(tǒng)全局異常映射處理

    SpringBoot配置系統(tǒng)全局異常映射處理

    在項(xiàng)目開發(fā)中,肯定少不了異常的出現(xiàn),作為后臺(tái)開發(fā)人員,我們總是在不停的寫各種接口提供給前端調(diào)用,然而不可避免的,當(dāng)后臺(tái)出現(xiàn)BUG時(shí),前端總是丑陋的講錯(cuò)誤信息直接暴露給用戶,這樣的用戶體驗(yàn)想必是相當(dāng)差的,本文主要講解異常映射的配置
    2021-06-06
  • SpringBoot中如何啟動(dòng)Tomcat流程

    SpringBoot中如何啟動(dòng)Tomcat流程

    這篇文章主要介紹了SpringBoot中如何啟動(dòng)Tomcat流程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2019-05-05
  • Spring如何集成ibatis項(xiàng)目并實(shí)現(xiàn)dao層基類封裝

    Spring如何集成ibatis項(xiàng)目并實(shí)現(xiàn)dao層基類封裝

    這篇文章主要介紹了Spring如何集成ibatis項(xiàng)目并實(shí)現(xiàn)dao層基類封裝,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • JDBC三層架構(gòu)深入刨析

    JDBC三層架構(gòu)深入刨析

    三層架構(gòu)是一種軟件設(shè)計(jì)架構(gòu),是一種組織代碼的手段和方法,三層架構(gòu)的優(yōu)點(diǎn)是擴(kuò)展性好,復(fù)用性高;缺點(diǎn)是步驟多,比較繁瑣;代碼多,效率降低
    2022-12-12
  • 基于jdk1.8的Java源碼詳解 Integer

    基于jdk1.8的Java源碼詳解 Integer

    這篇文章主要介紹了基于jdk1.8的Java源碼詳解 Integer,Integer是int的Warpper類,是面向?qū)ο蟮募碠OP的對(duì)象類型,,需要的朋友可以參考下
    2019-06-06
  • Java 判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞

    Java 判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞

    本篇文章主要介紹了判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-05-05
  • 最新log4j2遠(yuǎn)程代碼執(zhí)行漏洞(附解決方法)

    最新log4j2遠(yuǎn)程代碼執(zhí)行漏洞(附解決方法)

    Apache?Log4j2?遠(yuǎn)程代碼執(zhí)行漏洞攻擊代碼,該漏洞利用無(wú)需特殊配置,經(jīng)多方驗(yàn)證,Apache?Struts2、Apache?Solr、Apache?Druid、Apache?Flink等均受影響,本文就介紹一下解決方法
    2021-12-12
  • Java的關(guān)鍵字與保留字小結(jié)

    Java的關(guān)鍵字與保留字小結(jié)

    Java 保留字列表 (依字母排序 共14組) : Java保留字是指現(xiàn)有Java版本尚未使用 但以后版本可能會(huì)作為關(guān)鍵字使用
    2012-10-10

最新評(píng)論

东乌珠穆沁旗| 嘉义市| 营山县| 惠水县| 云安县| 龙口市| 汝州市| 二连浩特市| 滁州市| 资兴市| 清苑县| 青阳县| 万源市| 嘉黎县| 郧西县| 淳化县| 安溪县| 灌阳县| 武隆县| 青铜峡市| 贵州省| 枝江市| 吉木萨尔县| 兰西县| 博兴县| 梅河口市| 东港市| 黔南| 松潘县| 玛多县| 镇原县| 重庆市| 大邑县| 香河县| 刚察县| 安义县| 西青区| 荔波县| 柘城县| 滦平县| 望谟县|