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

java中sleep方法和wait方法的五個(gè)區(qū)別

 更新時(shí)間:2022年05月09日 16:09:27   作者:??Java中文社群????  
這篇文章主要介紹了java中sleep方法和wait方法的五個(gè)區(qū)別,sleep?方法和?wait?方法都是用來(lái)將線程進(jìn)入休眠狀態(tài),但是又有一些區(qū)別,下面我們就一起來(lái)看看吧

前言:

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

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

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

 初看代碼好像沒(méi)啥問(wèn)題,編譯器也沒(méi)報(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ù),且過(guò)了超時(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 之后,在主線程里嘗試獲取鎖卻沒(méi)有成功,只有 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方法的五個(gè)區(qū)別的文章就介紹到這了,更多相關(guān)sleep 和wait方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用Spring Boot ApplicationRunner解析命令行中的參數(shù)

    如何使用Spring Boot ApplicationRunner解析命令行中的參數(shù)

    這篇文章主要介紹了使用Spring Boot ApplicationRunner解析命令行中的參數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-12-12
  • java接入創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)例講解

    java接入創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)例講解

    下面小編就為大家分享一篇java接入創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • java代碼實(shí)現(xiàn)雙向鏈表

    java代碼實(shí)現(xiàn)雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了java代碼實(shí)現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java結(jié)構(gòu)型設(shè)計(jì)模式之組合模式詳解

    Java結(jié)構(gòu)型設(shè)計(jì)模式之組合模式詳解

    組合模式,又叫部分整體模式,它創(chuàng)建了對(duì)象組的數(shù)據(jù)結(jié)構(gòu)組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的訪問(wèn)具有一致性。本文將通過(guò)示例為大家詳細(xì)介紹一下組合模式,需要的可以參考一下
    2022-09-09
  • Java利用Dijkstra算法求解拓?fù)潢P(guān)系最短路徑

    Java利用Dijkstra算法求解拓?fù)潢P(guān)系最短路徑

    迪杰斯特拉算法(Dijkstra)是由荷蘭計(jì)算機(jī)科學(xué)迪家迪杰斯特拉于1959年提出的,因此又叫狄克斯特拉算法。本文將利用迪克斯特拉(Dijkstra)算法求拓?fù)潢P(guān)系最短路徑,感興趣的可以了解一下
    2022-07-07
  • feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題

    feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題

    這篇文章主要介紹了feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • spring的父子容器及配置詳解

    spring的父子容器及配置詳解

    本篇文章主要介紹了spring的父子容器及配置詳解,詳細(xì)的介紹了spring父子容器的概念、使用場(chǎng)景和用法,有興趣的可以了解一下
    2018-01-01
  • Mybatis批量插入數(shù)據(jù)的兩種方式總結(jié)與對(duì)比

    Mybatis批量插入數(shù)據(jù)的兩種方式總結(jié)與對(duì)比

    批量插入功能是我們?nèi)粘9ぷ髦斜容^常見(jiàn)的業(yè)務(wù)功能之一,下面這篇文章主要給大家介紹了關(guān)于Mybatis批量插入數(shù)據(jù)的兩種方式總結(jié)與對(duì)比的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • JAVA實(shí)現(xiàn)賬戶取款和存款操作

    JAVA實(shí)現(xiàn)賬戶取款和存款操作

    這篇文章主要介紹了JAVA實(shí)現(xiàn)賬戶取款和存款操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring中基于xml配置管理Bean的步驟

    Spring中基于xml配置管理Bean的步驟

    Spring容器通常理解為BeanFactory或者ApplicationContext,我們知道spring的IOC容器能夠幫我們創(chuàng)建對(duì)象,對(duì)象交給spring管理之后我們就不用手動(dòng)去new對(duì)象,這篇文章主要介紹了Spring中基于xml配置管理Bean的步驟,需要的朋友可以參考下
    2023-11-11

最新評(píng)論