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

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

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

前言:

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

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

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

 初看代碼好像沒啥問題,編譯器也沒報錯,然而當我們運行以上程序時就會發(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é)果可以看出,當調(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),并且它們都可以響應 interrupt 中斷,但二者的區(qū)別主要體現(xiàn)在:語法使用不同、所屬類不同、喚醒方式不同、釋放鎖不同和線程進入的狀態(tài)不同。?

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

相關(guān)文章

  • Java接口返回json如何忽略特定屬性

    Java接口返回json如何忽略特定屬性

    這篇文章主要介紹了Java接口返回json如何忽略特定屬性,通過SimplePropertyPreFilter方式(Json返回),這種寫法,接口返回類型就要求是Json字符串類型,本文通過場景實例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Java8利用Stream實現(xiàn)列表去重的方法詳解

    Java8利用Stream實現(xiàn)列表去重的方法詳解

    這篇文章主要為大家介紹了Java利用Stream實現(xiàn)列表去重的幾種方法詳解,文中的示例代碼講解詳細,需要的小伙伴可以參考一下
    2022-04-04
  • 解讀@Data注解父子類繼承的問題

    解讀@Data注解父子類繼承的問題

    在Java開發(fā)中,使用Lombok庫的@Data注解簡化了代碼,但在父子類繼承關(guān)系中使用@Data注解時會遇到問題,主要問題是:當父類和子類都使用@Data注解時,會導致equals方法不對稱,解決方案是在子類中使用@EqualsAndHashCode注解
    2024-11-11
  • java以json格式向后臺服務器接口發(fā)送請求的實例

    java以json格式向后臺服務器接口發(fā)送請求的實例

    下面小編就為大家分享一篇java以json格式向后臺服務器接口發(fā)送請求的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java多維數(shù)組詳解

    Java多維數(shù)組詳解

    大家好,本篇文章主要講的是Java多維數(shù)組詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 淺談一下Java中的訪問修飾符以及作用

    淺談一下Java中的訪問修飾符以及作用

    這篇文章主要介紹了淺談一下Java中的訪問修飾符以及作用,修飾符修飾的是“被訪問”的權(quán)限,所有修飾符都可以修飾成員變量,方法,構(gòu)造方法,需要的朋友可以參考下
    2023-05-05
  • Spring加載properties文件的方法

    Spring加載properties文件的方法

    這篇文章主要為大家詳細介紹了Spring加載properties文件的兩種方法,一是通過xml方式,另一種方式是通過注解方式,感興趣的小伙伴們可以參考一下
    2016-06-06
  • JAVA正則表達式的基本使用教程

    JAVA正則表達式的基本使用教程

    這篇文章主要給大家介紹了關(guān)于JAVA正則表達式的基本使用教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 為什么說要慎用SpringBoot @ComponentScan

    為什么說要慎用SpringBoot @ComponentScan

    本文主要介紹了為什么說要慎用SpringBoot @ComponentScan,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • eclipse實現(xiàn)可認證的DH密鑰交換協(xié)議

    eclipse實現(xiàn)可認證的DH密鑰交換協(xié)議

    這篇文章主要介紹了eclipse實現(xiàn)可認證的DH密鑰交換協(xié)議,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評論

肇州县| 科技| 开封市| 潼南县| 同德县| 天祝| 开鲁县| 塘沽区| 普陀区| 清镇市| 沛县| 双峰县| 毕节市| 昌黎县| 鄯善县| 萨嘎县| 来宾市| 商南县| 泾源县| 都江堰市| 墨江| 工布江达县| 东兴市| 宣化县| 白银市| 建德市| 蚌埠市| 海门市| 遂昌县| 苏尼特右旗| 城固县| 疏附县| 普安县| 获嘉县| 塔城市| 浦江县| 桂阳县| 济南市| 翁牛特旗| 淅川县| 孟津县|