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

Java詳細(xì)分析sleep和wait方法有哪些區(qū)別

 更新時(shí)間:2022年04月26日 09:00:48   作者:淡沫初夏Zz  
這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無參區(qū)別),通過代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下

一、sleep和wait方法的區(qū)別

  • 根本區(qū)別:sleep是Thread類中的方法,不會(huì)馬上進(jìn)入運(yùn)行狀態(tài),wait是Object類中的方法,一旦一個(gè)對(duì)象調(diào)用了wait方法,必須要采用notify()和notifyAll()方法喚醒該進(jìn)程
  • 釋放同步鎖:sleep會(huì)釋放cpu,但是sleep不會(huì)釋放同步鎖的資源,wait會(huì)釋放同步鎖資源
  • 使用范圍: sleep可以在任何地方使用,但wait只能在synchronized的同步方法或是代碼塊中使用
  • 異常處理: sleep需要捕獲異常,而wait不需要捕獲異常

二、wait方法

  • 使當(dāng)前執(zhí)行代碼的線程進(jìn)行等待. (把線程放到等待隊(duì)列中)
  • 釋放當(dāng)前的鎖
  • 滿足一定條件時(shí)被喚醒, 重新嘗試獲取這個(gè)鎖.
  • wait 要搭配 synchronized 來使用,脫離 synchronized 使用 wait 會(huì)直接拋出異常.

wait方法的使用

wait方法

/**
 * wait的使用
 */
public class WaitDemo1 {
    public static void main(String[] args) {
        Object lock = new Object();
        Thread t1 = new Thread(() -> {
            System.out.println("線程1開始執(zhí)行");
            try {
                synchronized (lock) {
                    System.out.println("線程1調(diào)用wait方法....");
                    // 無限期的等待狀態(tài)
                    lock.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("線程1執(zhí)行完成");
        }, "線程1");
        t1.start();
    }
}

有參wait線程和無參wait線程

/**
 * 有參wait線程和無參wait線程
 */
public class WaitDemo2 {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread t1 = new Thread(()->{
            System.out.println("線程1開始執(zhí)行");
            synchronized (lock1){
                try {
                    lock1.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("線程1執(zhí)行完成");
            }
        },"無參wait線程");
        t1.start();
        Thread t2 = new Thread(()->{
            System.out.println("線程2開始執(zhí)行");
            synchronized (lock2){
                try {
                    lock2.wait(60*60*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("線程2執(zhí)行完成");
            }
        },"有參wait線程");
        t2.start();
    }
}

wait結(jié)束等待的條件

①其他線程調(diào)用該對(duì)象的 notify 方法.

②wait 等待時(shí)間超時(shí) (wait 方法提供一個(gè)帶有 timeout 參數(shù)的版本, 來指定等待時(shí)間).

③其他線程調(diào)用該等待線程的 interrupted 方法, 導(dǎo)致 wait 拋出 InterruptedException 異常

三、notify和notifyAll方法

notify 方法只是喚醒某一個(gè)等待的線程

  1. 方法notify()也要在同步方法或同步塊中調(diào)用,該方法是用來通知那些可能等待該對(duì)象的對(duì)象鎖的其它線程
  2. 如果有多個(gè)線程等待,隨機(jī)挑選一個(gè)wait狀態(tài)的線程
  3. 在notify()方法后,當(dāng)前線程不會(huì)馬上釋放該對(duì)象鎖,要等到執(zhí)行notify()方法的線程將程序執(zhí)行完,也就是退出同步代碼塊之后才會(huì)釋放對(duì)象鎖

notify方法的使用

/**
 * wait的使用, 如果有多個(gè)線程等待,隨機(jī)挑選一個(gè)wait狀態(tài)的線程
 */
public class WaitNotifyDemo {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread t1 = new Thread(()->{
            System.out.println("線程1開始執(zhí)行");
            try {
                synchronized (lock1) {
                    System.out.println("線程1調(diào)用wait方法");
                    lock1.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("線程1執(zhí)行完成");
        },"線程1");
        Thread t2 = new Thread(()->{
            System.out.println("線程2開始執(zhí)行");
            try {
                synchronized (lock1) {
                    System.out.println("線程2調(diào)用wait方法");
                    lock1.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("線程2執(zhí)行完成");
        },"線程2");
        t1.start();
        t2.start();
        // 喚醒 lock1 對(duì)象上休眠的線程的(隨機(jī)喚醒一個(gè))
        Thread t3 = new Thread(()->{
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("線程3開始執(zhí)行");
            synchronized (lock1){
                //發(fā)出喚醒通知
                System.out.println("執(zhí)行了喚醒");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"線程3");
        t3.start();
    }
}

notifyAll方法可以一次喚醒所有的等待線程

notifyAll方法的使用

/**
 * notifyAll-喚醒所有線程
 */
public class WaitNotifyAll {
    public static void main(String[] args) {
        Object lock = new Object();

        new Thread(() -> {
            System.out.println("線程1:開始執(zhí)行");
            synchronized (lock) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("線程1:執(zhí)行完成");
            }
        }, "無參wait線程").start();

        new Thread(() -> {
            synchronized (lock) {
                System.out.println("線程2:開始執(zhí)行 |" + LocalDateTime.now());
                try {
                    lock.wait(60 * 60 * 60 * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("線程2:執(zhí)行完成 | " + LocalDateTime.now());
            }
        }, "有參wait線程").start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lock) {
                System.out.println("喚醒所有線程");
                lock.notifyAll();
            }
        }).start();
    }
}

notify和notifyAll方法的區(qū)別

  1. 當(dāng)你調(diào)用notify時(shí),只有一個(gè)等待線程會(huì)被喚醒而且它不能保證哪個(gè)線程會(huì)被喚醒,這取決于線程調(diào)度器。
  2. 調(diào)用notifyAll方法,那么等待該鎖的所有線程都會(huì)被喚醒,但是在執(zhí)行剩余的代碼之前,所有被喚醒的線程都將爭(zhēng)奪鎖定,這就是為什么在循環(huán)上調(diào)用wait,因?yàn)槿绻鄠€(gè)線程被喚醒,那么線程是將獲得鎖定將首先執(zhí)行,它可能會(huì)重置等待條件,這將迫使后續(xù)線程等待。
  3. 因此,notify和notifyAll之間的關(guān)鍵區(qū)別在于notify()只會(huì)喚醒一個(gè)線程,而notifyAll方法將喚醒所有線程。

到此這篇關(guān)于Java詳細(xì)分析sleep和wait方法有哪些區(qū)別的文章就介紹到這了,更多相關(guān)Java sleep與wait內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java簡(jiǎn)單實(shí)現(xiàn)斗地主發(fā)牌功能

    java簡(jiǎn)單實(shí)現(xiàn)斗地主發(fā)牌功能

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)斗地主發(fā)牌功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • MyBatis實(shí)現(xiàn)三級(jí)樹查詢的示例代碼

    MyBatis實(shí)現(xiàn)三級(jí)樹查詢的示例代碼

    在實(shí)際項(xiàng)目開發(fā)中,樹形結(jié)構(gòu)的數(shù)據(jù)查詢是一個(gè)非常常見的需求,比如組織架構(gòu)、菜單管理、地區(qū)選擇等場(chǎng)景都需要處理樹形數(shù)據(jù),本文將詳細(xì)講解如何使用MyBatis實(shí)現(xiàn)三級(jí)樹形數(shù)據(jù)的查詢,需要的朋友可以參考下
    2024-12-12
  • Java中的Spring循環(huán)依賴詳情

    Java中的Spring循環(huán)依賴詳情

    這篇文章主要介紹了Java中的Spring循環(huán)依賴詳情,文章基于Java的相關(guān)資料展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • Java創(chuàng)建多線程的幾種方式實(shí)現(xiàn)

    Java創(chuàng)建多線程的幾種方式實(shí)現(xiàn)

    這篇文章主要介紹了Java創(chuàng)建多線程的幾種方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 淺談HashMap、HashTable的key和value是否可為null

    淺談HashMap、HashTable的key和value是否可為null

    這篇文章主要介紹了淺談HashMap、HashTable的key和value是否可為null,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot3.3.0升級(jí)方案

    SpringBoot3.3.0升級(jí)方案

    本文介紹了由SpringBoot2升級(jí)到SpringBoot3.3.0升級(jí)方案,新版本的升級(jí)可以解決舊版本存在的部分漏洞問題,感興趣的可以了解一下
    2024-08-08
  • Java集合教程之Collection實(shí)例詳解

    Java集合教程之Collection實(shí)例詳解

    集合,或者叫容器,是一個(gè)包含多個(gè)元素的對(duì)象,下面這篇文章主要給大家介紹了關(guān)于Java集合教程之Collection的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-08-08
  • Java中幾種常用數(shù)據(jù)庫連接池的使用

    Java中幾種常用數(shù)據(jù)庫連接池的使用

    數(shù)據(jù)庫連接池在編寫應(yīng)用服務(wù)是經(jīng)常需要用到的模塊,太過頻繁的連接數(shù)據(jù)庫對(duì)服務(wù)性能來講是一個(gè)瓶頸,使用緩沖池技術(shù)可以來消除這個(gè)瓶頸,本文就來介紹Java常見的幾種,感興趣的可以了解一下
    2021-05-05
  • java繪制哆啦A夢(mèng) 超可愛

    java繪制哆啦A夢(mèng) 超可愛

    這篇文章主要介紹了java繪制哆啦A夢(mèng),特別的可愛,文中示例代碼介紹的也非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Java排序算法之冒泡排序的原理及優(yōu)化

    Java排序算法之冒泡排序的原理及優(yōu)化

    這篇文章主要介紹了Java排序算法之冒泡排序的原理及優(yōu)化,冒泡排序的思想很簡(jiǎn)單,遍歷數(shù)組,比較相鄰的兩個(gè)元素,順序錯(cuò)誤就把它們交換,直到整個(gè)數(shù)組排序完成,因?yàn)槊拷?jīng)過一趟排序,越小的元素會(huì)經(jīng)交換而慢慢“浮”到數(shù)列的頂端,因此叫做冒泡排序,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

甘孜| 紫金县| 出国| 尖扎县| 姚安县| 安龙县| 忻州市| 河南省| 陈巴尔虎旗| 紫云| 寻乌县| 若尔盖县| 中超| 南安市| 潼南县| 安陆市| 拉孜县| 博野县| 新建县| 大化| 耒阳市| 丰宁| 吴堡县| 申扎县| 大关县| 遂川县| 广宗县| 泉州市| 银川市| 新蔡县| 武宁县| 峨山| 巧家县| 乌拉特中旗| 东山县| 永济市| 黔西县| 桦川县| 天等县| 额尔古纳市| 瓮安县|