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

Java面試之線程通訊方式詳解

 更新時(shí)間:2023年08月03日 16:23:37   作者:磊哥|www.javacn.site  
線程通信是指多個(gè)線程之間通過某種機(jī)制進(jìn)行協(xié)調(diào)和交互,那為什么一個(gè)線程等待和通知機(jī)制就需要這么多的實(shí)現(xiàn)方式呢?別著急,下面小編來和大家仔細(xì)聊聊

線程通信是指多個(gè)線程之間通過某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。

在 Java 中,線程等待和通知的實(shí)現(xiàn)手段有以下幾種方式:

  • Object 類下的 wait()、notify() 和 notifyAll() 方法;
  • Condition 類下的 await()、signal() 和 signalAll() 方法;
  • LockSupport 類下的 park() 和 unpark() 方法。

為什么一個(gè)線程等待和通知機(jī)制就需要這么多的實(shí)現(xiàn)方式呢?別著急,咱們先來看實(shí)現(xiàn),再來說原因。

一、wait/notify/notifyAll

Object 類的方法說明:

  • wait():讓當(dāng)前線程處于等待狀態(tài),并釋放當(dāng)前擁有的鎖;
  • notify():隨機(jī)喚醒等待該鎖的其他線程,重新獲取鎖,并執(zhí)行后續(xù)的流程,只能喚醒一個(gè)線程;
  • notifyAll():喚醒所有等待該鎖的線程(鎖只有一把,雖然所有線程被喚醒,但所有線程需要排隊(duì)執(zhí)行)。

示例代碼如下:

Object lock = new Object();
// 創(chuàng)建線程并執(zhí)行
new Thread(() -> {
    System.out.println("線程1:開始執(zhí)行");
    synchronized (lock) {
        try {
            System.out.println("線程1:進(jìn)入等待");
            lock.wait();
            System.out.println("線程1:繼續(xù)執(zhí)行");
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("線程1:執(zhí)行完成");
    }
}).start();
Thread.sleep(1000);
synchronized (lock) {
    // 喚醒線程
    System.out.println("執(zhí)行 notifyAll()");
    lock.notifyAll();
}

二、await/signal/signalAll

Condition 類的方法說明:

  • await():對應(yīng) Object 的 wait() 方法,線程等待;
  • signal():對應(yīng) Object 的 notify() 方法,隨機(jī)喚醒一個(gè)線程;
  • signalAll():對應(yīng) Object 的 notifyAll() 方法,喚醒所有線程。

示例代碼如下:

// 創(chuàng)建 Condition 對象
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition(); // lock 下可創(chuàng)建多個(gè) Condition
// 加鎖
lock.lock();
try {
    // 業(yè)務(wù)方法......
    // 1.進(jìn)入等待狀態(tài)
    condition.await();
    // 2.喚醒操作
    condition.signal();
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {
    lock.unlock();
}

三、park/unpark

LockSupport 類的方法說明:

  • LockSupport.park():休眠當(dāng)前線程。
  • LockSupport.unpark(線程對象):喚醒某一個(gè)指定的線程。

PS:LockSupport 無需配鎖(synchronized 或 Lock)一起使用。

示例代碼如下:

public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(() -> {
        LockSupport.park();
        System.out.println("線程1");
    }, "線程1");
    t1.start();
    Thread t2 = new Thread(() -> {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("喚醒線程1");
        LockSupport.unpark(t1);
    }, "線程2");
    t2.start();
}

四、小結(jié)

為什么一個(gè)線程等待和喚醒的功能需要這么多的實(shí)現(xiàn)呢?

  • LockSupport 存在的必要性:前兩種方法 notify 方法以及 signal 方法都是隨機(jī)喚醒,如果存在多個(gè)等待線程的話,可能會(huì)喚醒不應(yīng)該喚醒的線程,因此有 LockSupport 類下的 park 和 unpark 方法指定喚醒線程是非常有必要的。
  • Condition 存在的必要性:Condition 相比于 Object 類的 wait 和 notify/notifyAll 方法,前者可以創(chuàng)建多個(gè)等待集,例如,我們可以創(chuàng)建一個(gè)生產(chǎn)者等待喚醒對象,和一個(gè)消費(fèi)者等待喚醒對象,這樣我們就能實(shí)現(xiàn)生產(chǎn)者只能喚醒消費(fèi)者,而消費(fèi)者只能喚醒生產(chǎn)者的業(yè)務(wù)邏輯了,如下代碼所示:
// 創(chuàng)建 Condition 對象
private Lock lock = new ReentrantLock();
// 生產(chǎn)者的 Condition 對象
private Condition producerCondition = lock.newCondition();
// 本篇內(nèi)容出自磊哥《Java面試突擊訓(xùn)練營》 VX:GG_Stone
// 消費(fèi)者的 Condition 對象
private Condition consumerCondition = lock.newCondition();

也就是 Condition 是 Object 等待喚醒模型的升級,Object 類可以實(shí)現(xiàn)的功能它都能實(shí)現(xiàn),但 Condition 能實(shí)現(xiàn)的功能,Object 卻不能實(shí)現(xiàn),這就是 Condition 類存在的必要性。

那問題來了,為什么還有會(huì) Object 的 wait 和 notify 方法呢?

因?yàn)?Object 類誕生的比較早,也就是說 Condition 和 LockSupport 都是 JDK 后期版本才出現(xiàn)的功能,所以就有了現(xiàn)在這么多線程喚醒和等待的方法了。

到此這篇關(guān)于Java面試之線程通訊方式詳解的文章就介紹到這了,更多相關(guān)Java線程通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java TimedCache 帶時(shí)間緩存工具類詳解使用

    Java TimedCache 帶時(shí)間緩存工具類詳解使用

    工具類是包含集合框架、遺留的 collection 類、事件模型、日期和時(shí)間設(shè)施、國際化和各種實(shí)用工具類(字符串標(biāo)記生成器、隨機(jī)數(shù)生成器和位數(shù)組、日期Date類、堆棧Stack類、向量Vector類等)。集合類、時(shí)間處理模式、日期工具等各類常用工具包,本文將介紹帶時(shí)間緩存工具類
    2021-10-10
  • SpringBoot整合H2數(shù)據(jù)庫的操作方法

    SpringBoot整合H2數(shù)據(jù)庫的操作方法

    H2是一個(gè)Java語言編寫的嵌入式數(shù)據(jù)庫,它不受平臺的限制,同時(shí)H2提供了一個(gè)十分方便的web控制臺,用于操作和管理數(shù)據(jù)庫內(nèi)容,本文介紹SpringBoot整合H2數(shù)據(jù)庫的方法,感興趣的朋友一起看看吧
    2024-01-01
  • springboot常見登錄(注冊)幾種實(shí)現(xiàn)過程

    springboot常見登錄(注冊)幾種實(shí)現(xiàn)過程

    這篇文章主要介紹了如何實(shí)現(xiàn)用戶注冊、登錄和微信掃碼登錄功能,注冊功能通過手機(jī)號和短信驗(yàn)證碼完成,登錄功能通過賬號密碼和微信掃碼兩種方式實(shí)現(xiàn),并使用JWT進(jìn)行單點(diǎn)登錄
    2026-02-02
  • springboot hazelcast緩存中間件的實(shí)例代碼

    springboot hazelcast緩存中間件的實(shí)例代碼

    這篇文章主要介紹了springboot hazelcast緩存中間件的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • Nacos的單機(jī)模式啟動(dòng)失敗問題及解決

    Nacos的單機(jī)模式啟動(dòng)失敗問題及解決

    這篇文章主要介紹了Nacos的單機(jī)模式啟動(dòng)失敗問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Vue3打包部署到SpringBoot3的詳細(xì)步驟

    Vue3打包部署到SpringBoot3的詳細(xì)步驟

    在Vue3項(xiàng)目中,打包指令主要用于將項(xiàng)目編譯成可以在生產(chǎn)環(huán)境中部署的靜態(tài)文件,這篇文章主要介紹了Vue3打包部署到SpringBoot3的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-10-10
  • JavaWeb中的filter過濾敏感詞匯案例詳解

    JavaWeb中的filter過濾敏感詞匯案例詳解

    敏感詞、文字過濾是一個(gè)網(wǎng)站必不可少的功能,本篇文章主要介紹了JavaWeb中的filter過濾敏感詞匯案例,具有一定的參考價(jià)值,有需要的可以了解一下,
    2016-11-11
  • Java框架篇:Spring+SpringMVC+hibernate整合開發(fā)

    Java框架篇:Spring+SpringMVC+hibernate整合開發(fā)

    本篇文章將會(huì)對Spring+SpringMVC+hibernate的整合開發(fā)進(jìn)行介紹。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-02-02
  • Java使用String類格式化當(dāng)前日期實(shí)現(xiàn)代碼

    Java使用String類格式化當(dāng)前日期實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java使用String類格式化當(dāng)前日期實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-02-02
  • 使用EasyExcel實(shí)現(xiàn)模板導(dǎo)出Excel數(shù)據(jù)并合并單元格

    使用EasyExcel實(shí)現(xiàn)模板導(dǎo)出Excel數(shù)據(jù)并合并單元格

    這篇文章主要為大家詳細(xì)介紹了如何使用EasyExcel實(shí)現(xiàn)模板導(dǎo)出Excel數(shù)據(jù)并合并單元格,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-03-03

最新評論

抚远县| 贡山| 安顺市| 手游| 镇原县| 乌拉特后旗| 景德镇市| 辽阳县| 黎川县| 盱眙县| 赤壁市| 米脂县| 拜泉县| 乳山市| 天长市| 沙洋县| 临沂市| 黄骅市| 四子王旗| 聊城市| 资兴市| 古田县| 繁昌县| 通化县| 嵩明县| 仁化县| 克拉玛依市| 奉化市| 沧源| 漳平市| 岑巩县| 长沙市| 东丰县| 林州市| 宁河县| 怀远县| 鄢陵县| 大新县| 北安市| 铅山县| 永福县|