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

Java中Object.wait()和LockSupport.park()的用法

 更新時(shí)間:2024年05月16日 10:54:42   作者:杉斯狼  
Object.wait()和LockSupport.park()都是用來(lái)使當(dāng)前線程等待的方法,本文主要介紹了Java中Object.wait()和LockSupport.park()的用法,具有一定的參考價(jià)值,感興趣的可以了解一下

Object.wait() 和 LockSupport.park() 都是用來(lái)使當(dāng)前線程等待的方法,但它們?cè)谑褂脠?chǎng)景和機(jī)制上有所不同:

Object.wait()

  • 用途wait() 方法屬于對(duì)象監(jiān)視器(Monitor)的一部分,通常與 synchronized 塊或方法一起使用。當(dāng)線程調(diào)用某個(gè)對(duì)象的 wait() 方法時(shí),它會(huì)釋放該對(duì)象的鎖,并使自己進(jìn)入等待狀態(tài),直到其他線程調(diào)用該對(duì)象的 notify() 或 notifyAll() 方法喚醒它,此時(shí)線程會(huì)重新嘗試獲取鎖并繼續(xù)執(zhí)行。

  • 位置限制:只能在同步代碼塊或同步方法中調(diào)用,因?yàn)樾枰全@取到對(duì)象的監(jiān)視器鎖。

  • 喚醒條件:可以被 notify() 喚醒,意味著有一個(gè)或多個(gè)等待線程會(huì)被喚醒,但具體哪個(gè)線程被喚醒是不確定的;也可以被 notifyAll() 喚醒,這時(shí)所有等待該對(duì)象監(jiān)視器的線程都會(huì)進(jìn)入鎖的競(jìng)爭(zhēng)狀態(tài)。

LockSupport.park()

  • 用途park() 方法屬于 java.util.concurrent.locks.LockSupport 類(lèi),它提供了一種低級(jí)別的線程阻塞原語(yǔ)。它不需要與特定的鎖關(guān)聯(lián),可以在任何地方調(diào)用,使得線程阻塞。它通常與 unpark() 方法配對(duì)使用,后者可以喚醒一個(gè)調(diào)用了 park() 的線程。

  • 位置限制:沒(méi)有位置限制,可以在任何地方調(diào)用,不需要先獲取鎖。

  • 喚醒條件:調(diào)用 LockSupport.unpark(Thread thread) 方法可以直接喚醒目標(biāo)線程,更加靈活和精確。它可以喚醒一個(gè)特定的線程,而無(wú)需競(jìng)爭(zhēng)或不確定性。

  • 線程許可park() 和 unpark() 是基于每個(gè)線程的許可(permit)機(jī)制。初始時(shí),每個(gè)線程沒(méi)有許可,調(diào)用 unpark() 會(huì)給指定線程添加一個(gè)許可,即使之前已經(jīng)調(diào)用過(guò) unpark() 給該線程添加了許可,再調(diào)用也不會(huì)造成影響(許可不會(huì)累積)。調(diào)用 park() 時(shí),如果沒(méi)有許可,線程會(huì)阻塞,如果有許可,則消耗許可并繼續(xù)執(zhí)行。

總結(jié)來(lái)說(shuō),Object.wait() 更適合與同步代碼塊或方法一起使用,與對(duì)象的監(jiān)視器鎖緊密相關(guān),適用于傳統(tǒng)的線程協(xié)作場(chǎng)景;而 LockSupport.park() 提供了一種更底層、更靈活的線程阻塞和喚醒機(jī)制,適用于更復(fù)雜的并發(fā)控制邏輯。

下面是分別使用 Object.wait() 和 LockSupport.park() 的簡(jiǎn)單示例:

使用 Object.wait() 的例子

public class WaitNotifyExample {
    public static void main(String[] args) {
        final Object monitor = new Object();
        
        Thread waitingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (monitor) {
                    System.out.println(Thread.currentThread().getName() + " 開(kāi)始等待");
                    try {
                        monitor.wait(); // 等待被喚醒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " 被喚醒");
                }
            }
        }, "WaitingThread");
        
        Thread notifierThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000); // 模擬一些工作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                synchronized (monitor) {
                    monitor.notify(); // 喚醒等待的線程
                    System.out.println(Thread.currentThread().getName() + " 發(fā)出了喚醒通知");
                }
            }
        }, "NotifierThread");
        
        waitingThread.start();
        notifierThread.start();
    }
}

使用 LockSupport.park() 的例子

import java.util.concurrent.locks.LockSupport;

public class ParkUnparkExample {
    public static void main(String[] args) {
        Thread waitingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " 開(kāi)始等待");
                LockSupport.park(); // 阻塞當(dāng)前線程
                System.out.println(Thread.currentThread().getName() + " 被喚醒");
            }
        }, "WaitingThread");
        
        Thread unparkerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000); // 模擬一些工作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                System.out.println(Thread.currentThread().getName() + " 準(zhǔn)備喚醒線程");
                LockSupport.unpark(waitingThread); // 喚醒指定線程
            }
        }, "UnparkerThread");
        
        waitingThread.start();
        unparkerThread.start();
    }
}

在這兩個(gè)例子中,第一個(gè)展示了如何使用 Object.wait() 和 notify() 來(lái)實(shí)現(xiàn)線程間的等待與通知,第二個(gè)例子展示了如何使用 LockSupport.park() 和 unpark() 實(shí)現(xiàn)類(lèi)似的線程控制功能,但更為靈活和獨(dú)立于特定鎖。

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

相關(guān)文章

  • 使用mybatisPlus的queryWrapper做左聯(lián)接,內(nèi)聯(lián)接方式

    使用mybatisPlus的queryWrapper做左聯(lián)接,內(nèi)聯(lián)接方式

    本文介紹了如何使用Mybatis-Plus的QueryWrapper進(jìn)行SQL查詢,包括左連接、內(nèi)連接等操作,通過(guò)示例代碼展示了如何構(gòu)建復(fù)雜的SQL查詢,并將結(jié)果存儲(chǔ)在List對(duì)象中返回,希望給讀者提供參考
    2025-03-03
  • 一文帶你徹底理解Java序列化和反序列化

    一文帶你徹底理解Java序列化和反序列化

    這篇文章主要介紹了Java序列化和反序列化的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Java8使用Supplier啟動(dòng)ScheduledThread代碼實(shí)例

    Java8使用Supplier啟動(dòng)ScheduledThread代碼實(shí)例

    這篇文章主要介紹了Java8使用Supplier啟動(dòng)ScheduledThread詳解,項(xiàng)目開(kāi)啟立即啟動(dòng)定時(shí)任務(wù)是很多項(xiàng)目都會(huì)遇到的一個(gè)需求,如何利用Java提供的函數(shù)優(yōu)雅的寫(xiě)出來(lái)十分考驗(yàn)一個(gè)人的功底,需要的朋友可以參考下
    2024-01-01
  • Springboot升級(jí)至2.4.0中出現(xiàn)的跨域問(wèn)題分析及修改方案

    Springboot升級(jí)至2.4.0中出現(xiàn)的跨域問(wèn)題分析及修改方案

    這篇文章主要介紹了Springboot升級(jí)至2.4.0中出現(xiàn)的跨域問(wèn)題分析及修改方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java項(xiàng)目開(kāi)發(fā)命名規(guī)范(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java項(xiàng)目開(kāi)發(fā)命名規(guī)范(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    定義這個(gè)規(guī)范的目的是讓項(xiàng)目中所有的文檔都看起來(lái)像一個(gè)人寫(xiě)的,增加可讀性,減少項(xiàng)目組中因?yàn)閾Q人而帶來(lái)的損失。下面給大家分享java開(kāi)發(fā)命名規(guī)范,一起看看吧
    2017-03-03
  • 詳解如何在SpringBoot項(xiàng)目中使用全局異常處理

    詳解如何在SpringBoot項(xiàng)目中使用全局異常處理

    在完整的項(xiàng)目開(kāi)發(fā)中,異常的出現(xiàn)幾乎是無(wú)法避免的;如果凡是有可能出現(xiàn)異常的地方,我們都手動(dòng)的使用try-catch將其捕獲的話,會(huì)使得代碼顯得十分臃腫并且后期不好維護(hù)。本文介紹了pringBoot項(xiàng)目中使用全局異常處理的方法,需要的可以參考一下
    2022-10-10
  • 對(duì)象存儲(chǔ)服務(wù)MinIO快速入門(mén)(集成項(xiàng)目的詳細(xì)過(guò)程)

    對(duì)象存儲(chǔ)服務(wù)MinIO快速入門(mén)(集成項(xiàng)目的詳細(xì)過(guò)程)

    MinIO是一個(gè)開(kāi)源的對(duì)象存儲(chǔ)服務(wù),支持多種操作系統(tǒng),配置簡(jiǎn)單且性能高,它使用糾刪碼進(jìn)行數(shù)據(jù)保護(hù),可以容忍硬件故障,MinIO支持多種語(yǔ)言的SDK和豐富的API,本文介紹對(duì)象存儲(chǔ)服務(wù)MinIO快速入門(mén),感興趣的朋友一起看看吧
    2025-03-03
  • 基于Springboot的漫畫(huà)網(wǎng)站平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)

    基于Springboot的漫畫(huà)網(wǎng)站平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)

    本文將基于Springboot實(shí)現(xiàn)開(kāi)發(fā)一個(gè)漫畫(huà)主題的網(wǎng)站,實(shí)現(xiàn)一個(gè)比漂亮的動(dòng)漫連載的網(wǎng)站系統(tǒng),界面設(shè)計(jì)優(yōu)雅大方,比較適合做畢業(yè)設(shè)計(jì)和課程設(shè)計(jì)使用,需要的可以參考一下
    2022-08-08
  • Java導(dǎo)出Excel動(dòng)態(tài)表頭的示例詳解

    Java導(dǎo)出Excel動(dòng)態(tài)表頭的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java導(dǎo)出Excel動(dòng)態(tài)表頭的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下
    2025-02-02
  • java實(shí)現(xiàn)自定義日期選擇器的方法實(shí)例

    java實(shí)現(xiàn)自定義日期選擇器的方法實(shí)例

    日期選擇器是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常需要用到的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于利用java實(shí)現(xiàn)自定義日期選擇器的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10

最新評(píng)論

龙井市| 海丰县| 班戈县| 崇礼县| 左云县| 庆云县| 霍山县| 怀仁县| 银川市| 永州市| 庆安县| 通江县| 巴林左旗| 泗洪县| 班戈县| 治县。| 乌拉特后旗| 会宁县| 林口县| 临朐县| 札达县| 天水市| 商南县| 萨嘎县| 临湘市| 贵定县| 盐山县| 临夏市| 米脂县| 平邑县| 景洪市| 临安市| 什邡市| 巧家县| 浦县| 彰武县| 乌审旗| 临潭县| 景东| 凤翔县| 临朐县|