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

Java多線程中的wait、notify和park、unpark的使用詳解

 更新時(shí)間:2023年12月16日 09:36:44   作者:小晨想好好學(xué)習(xí)  
這篇文章主要介紹了Java多線程中的wait、notify和park、unpark的使用詳解,它們都是線程之間進(jìn)行協(xié)作的手段,都屬于 Object 對(duì)象的方法,必須獲得此對(duì)象的鎖,才能調(diào)用這幾個(gè)方法,需要的朋友可以參考下

一、wait & notify的使用

1、API介紹

  • obj.wait() 讓進(jìn)入 object 監(jiān)視器的線程到 waitSet 等待
  • obj.wait(n) 讓進(jìn)入 object 監(jiān)視器的線程到 waitSet 等待,n秒后還沒(méi)有被喚醒的話(huà),則自動(dòng)醒來(lái)
  • obj.notify() 在 object 上正在 waitSet 等待的線程中挑一個(gè)喚醒
  • obj.notifyAll() 讓 object 上正在 waitSet 等待的線程全部喚醒

它們都是線程之間進(jìn)行協(xié)作的手段,都屬于 Object 對(duì)象的方法。

必須獲得此對(duì)象的鎖,才能調(diào)用這幾個(gè)方法 wait() 方法會(huì)釋放對(duì)象的鎖,進(jìn)入 WaitSet 等待區(qū),從而讓其他線程就機(jī)會(huì)獲取對(duì)象的鎖。

無(wú)限制等待,直到notify 為止 wait(long n) 有時(shí)限的等待, 到 n 毫秒后結(jié)束等待,或是被 notify notify 只能隨機(jī)喚醒一個(gè) WaitSet 中的線程,這時(shí)如果有其它線程也在等待,那么就可能喚醒不了正確的線程,稱(chēng)之為【虛假喚醒】

2、demo

@Slf4j(topic = "c.TestCorrectPosture")
public class TestCorrectPostureStep5 {
    static final Object room = new Object();
    static boolean hasCigarette = false;
    static boolean hasTakeout = false;
    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (room) {
                log.debug("有煙沒(méi)?[{}]", hasCigarette);
                while (!hasCigarette) {
                    log.debug("沒(méi)煙,先歇會(huì)!");
                    try {
                        room.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                log.debug("有煙沒(méi)?[{}]", hasCigarette);
                if (hasCigarette) {
                    log.debug("可以開(kāi)始干活了");
                } else {
                    log.debug("沒(méi)干成活...");
                }
            }
        }, "小南").start();
        new Thread(() -> {
            synchronized (room) {
                Thread thread = Thread.currentThread();
                log.debug("外賣(mài)送到?jīng)]?[{}]", hasTakeout);
                while (!hasTakeout) {
                    log.debug("沒(méi)外賣(mài),先歇會(huì)!");
                    try {
                        room.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                log.debug("外賣(mài)送到?jīng)]?[{}]", hasTakeout);
                if (hasTakeout) {
                    log.debug("可以開(kāi)始干活了");
                } else {
                    log.debug("沒(méi)干成活...");
                }
            }
        }, "小女").start();
        sleep(1);
        new Thread(() -> {
            synchronized (room) {
                hasTakeout = true;
                log.debug("外賣(mài)到了噢!");
                room.notifyAll();
            }
        }, "送外賣(mài)的").start();
    }
}

在這里插入圖片描述

2、多線程模式

模式之保護(hù)性暫停 模式之生產(chǎn)者消費(fèi)者

3、wait和notify的原理

在這里插入圖片描述

二、Park & Unpark的使用

1、基本使用

它們是 LockSupport 類(lèi)中的方法

// 暫停當(dāng)前線程
LockSupport.park(); 
// 恢復(fù)某個(gè)線程的運(yùn)行
LockSupport.unpark(暫停線程對(duì)象)

先 park 再 unpark

public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            log.debug("start...");
            sleep(1);
            log.debug("park...");
            LockSupport.park();
            log.debug("resume...");
        }, "t1");
        t1.start();
        sleep(4);
        log.debug("unpark...");
        LockSupport.unpark(t1);
    }

在這里插入圖片描述

先 unpark 再 park

public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            log.debug("start...");
            sleep(2);
            log.debug("park...");
            LockSupport.park();
            log.debug("resume...");
        }, "t1");
        t1.start();
        sleep(1);
        log.debug("unpark...");
        LockSupport.unpark(t1);
    }

在這里插入圖片描述

結(jié)論:park和unpark是成對(duì)出現(xiàn),但是是不分先后的

2、特點(diǎn)

與 Object 的 wait & notify 相比

  • wait,notify 和 notifyAll 必須配合 Object Monitor 一起使用,而 park,unpark 不必
  • park & unpark 是以線程為單位來(lái)【阻塞】和【喚醒】線程(喚醒的時(shí)候可以傳一個(gè)線程作為參數(shù)),而 notify 只能隨機(jī)喚醒一個(gè)等待線程,notifyAll 是喚醒所有等待線程,就不那么【精確】
  • park & unpark 可以先 unpark,而 wait & notify 不能先 notify

到此這篇關(guān)于Java多線程中的wait、notify和park、unpark的使用詳解的文章就介紹到這了,更多相關(guān)Java多線程wait、notify和park內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中ArrayList和Vector的區(qū)別

    Java中ArrayList和Vector的區(qū)別

    本文主要介紹了Java中ArrayList和Vector的區(qū)別,包括線程安全性、性能、同步機(jī)制、擴(kuò)容機(jī)制、遍歷方式等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-11-11
  • 簡(jiǎn)單理解java泛型的本質(zhì)(非類(lèi)型擦除)

    簡(jiǎn)單理解java泛型的本質(zhì)(非類(lèi)型擦除)

    泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用。泛型是參數(shù)化類(lèi)型的應(yīng)用,操作的數(shù)據(jù)類(lèi)型不限定于特定類(lèi)型,可以根據(jù)實(shí)際需要設(shè)置不同的數(shù)據(jù)類(lèi)型,以實(shí)現(xiàn)代碼復(fù)用。下面小編來(lái)簡(jiǎn)單講一講泛型
    2019-05-05
  • SpringBoot整合ELK做日志超完整詳細(xì)教程

    SpringBoot整合ELK做日志超完整詳細(xì)教程

    本文詳細(xì)介紹了如何在springboot中快速接入ELK的過(guò)程,ELK可以說(shuō)在實(shí)際項(xiàng)目中具有很好的適用價(jià)值,不管是小項(xiàng)目,還是中大型項(xiàng)目,都具備普適參考性,值得深入了解和學(xué)習(xí),感興趣的朋友一起看看吧
    2024-01-01
  • java如何讀取文件目錄返回樹(shù)形結(jié)構(gòu)

    java如何讀取文件目錄返回樹(shù)形結(jié)構(gòu)

    這篇文章主要介紹了java如何讀取文件目錄返回樹(shù)形結(jié)構(gòu)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • idea中引入了gb2312編碼的文件的解決方法

    idea中引入了gb2312編碼的文件的解決方法

    這篇文章主要介紹了idea中引入了gb2312編碼的文件的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java中實(shí)現(xiàn)excel合并單元格詳細(xì)代碼實(shí)例

    java中實(shí)現(xiàn)excel合并單元格詳細(xì)代碼實(shí)例

    最近的工作中,遇到一個(gè)需求在生成的Excel表格后需要在尾部添加一個(gè)合并的單元格數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java中實(shí)現(xiàn)excel合并單元格的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • Kotlin中l(wèi)et、run、with、apply及also的用法和差別

    Kotlin中l(wèi)et、run、with、apply及also的用法和差別

    作用域函數(shù)是Kotlin比較重要的一個(gè)特性,分為5種let、run、with、apply及also,這五個(gè)函數(shù)的工作方式非常相似,但是我們需要了解這5種函數(shù)的差異,以便在不同的場(chǎng)景更好的利用它,這篇文章主要介紹了Kotlin中l(wèi)et、run、with、apply及also的差別,需要的朋友可以參考下
    2023-11-11
  • maven父工程relativepath標(biāo)簽使用解讀

    maven父工程relativepath標(biāo)簽使用解讀

    文章主要介紹了在使用Maven構(gòu)建父子工程時(shí)如何通過(guò)設(shè)置父工程和子工程的pom文件來(lái)管理依賴(lài)和版本,當(dāng)子工程是Spring Boot項(xiàng)目時(shí),可以通過(guò)關(guān)閉`relativePath`標(biāo)簽來(lái)繼承Spring Boot的父工程,同時(shí)在父工程中使用`dependencyManagement`標(biāo)簽來(lái)統(tǒng)一管理Spring Boot的依賴(lài)版本
    2024-11-11
  • java日期處理工具類(lèi)

    java日期處理工具類(lèi)

    這篇文章主要為大家詳細(xì)介紹了java日期處理工具類(lèi),其次還介紹了日期處理的基礎(chǔ)知識(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java數(shù)據(jù)存儲(chǔ)的“雙子星”對(duì)決(Map和Set的區(qū)別)

    Java數(shù)據(jù)存儲(chǔ)的“雙子星”對(duì)決(Map和Set的區(qū)別)

    文章主要介紹了Java中Map和Set兩種數(shù)據(jù)結(jié)構(gòu)的定義、實(shí)現(xiàn)、方法及應(yīng)用場(chǎng)景,Map用于存儲(chǔ)鍵值對(duì),鍵唯一,值可重復(fù);Set用于存儲(chǔ)唯一元素,無(wú)序,兩者都提供了豐富的操作方法,如添加、刪除、查找等,感興趣的朋友一起看看吧
    2025-02-02

最新評(píng)論

长子县| 长宁区| 卓资县| 汽车| 屏东县| 无锡市| 六安市| 北票市| 荥经县| 贵州省| 志丹县| 股票| 札达县| 中江县| 孝义市| 邵阳县| 宁德市| 监利县| 磐安县| 喜德县| 青河县| 邵武市| 巧家县| 稻城县| 迭部县| 仁化县| 双江| 上栗县| 乐昌市| 将乐县| 博爱县| 皋兰县| 南木林县| 兴仁县| 布尔津县| 鞍山市| 乐至县| 铜鼓县| 连南| 宝鸡市| 金乡县|