欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java開(kāi)發(fā)JUC交換器Exchanger使用詳解

 更新時(shí)間:2022年12月06日 11:02:44   作者:JAVA旭陽(yáng)  
這篇文章主要為大家介紹了Java開(kāi)發(fā)JUC交換器Exchanger使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

JDK中提供了不少的同步工具,現(xiàn)在分享一個(gè)相對(duì)比較冷門(mén)的同步工具——交換器(Exchanger)。你知道Exchanger的作用是什么嗎?實(shí)現(xiàn)機(jī)制是什么?可以用來(lái)做什么呢?

Exchanger介紹

交換器(Exchanger),顧名思義,用于兩個(gè)線程之間進(jìn)行數(shù)據(jù)交換的。

簡(jiǎn)單來(lái)說(shuō),就是一個(gè)線程在完成一定的事務(wù)后想與另一個(gè)線程交換數(shù)據(jù),則第一個(gè)先拿出數(shù)據(jù)的線程會(huì)一直等待第二個(gè)線程,直到第二個(gè)線程拿著數(shù)據(jù)到來(lái)時(shí)才能彼此交換對(duì)應(yīng)數(shù)據(jù)。如下圖所示:

兩個(gè)線程通過(guò) exchange() 方法交換數(shù)據(jù),如果第一個(gè)線程先執(zhí)行 exchange() 方法,它會(huì)一直等待第二個(gè)線程也執(zhí)行 exchange 方法,當(dāng)兩個(gè)線程都到達(dá)同步點(diǎn)時(shí),這兩個(gè)線程就可以交換數(shù)據(jù)

API介紹

構(gòu)造方法

  • Exchanger():創(chuàng)建一個(gè)交換器

常用方法

  • V exchange(V x): 交換數(shù)據(jù),如果只有一個(gè)線程,會(huì)阻塞,直到另外一個(gè)線程也調(diào)用exchange, 支持中斷
  • V exchange(V x, long timeout, TimeUnit unit): 帶超時(shí)參數(shù)的交換數(shù)據(jù)

Exchanger使用

這不,馬上圣誕節(jié)要到了,你要和你對(duì)象交換禮物,不準(zhǔn)備的話,你就要死的很慘~~我們就可以用Exchanger來(lái)實(shí)現(xiàn)。

@Slf4j(topic = "c.ExchangerTest")
public class ExchangerTest {
    public static void main(String[] args) throws InterruptedException {
        Exchanger<String> exchanger = new Exchanger<>();
        Thread boy = new Thread(new Runnable() {
            @Override
            public void run() {
                log.info("你開(kāi)始準(zhǔn)備禮物~~~~~~~~~~~~");
                try {
                    // 模擬準(zhǔn)備禮物時(shí)間
                    Thread.sleep(5000);
                    String gift = "IPhone 14";
                    log.info("你送了禮物: {}",  gift);
                    String recGift = exchanger.exchange(gift);
                    log.info("你收到了禮物: {}",  recGift);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread girl = new Thread(new Runnable() {
            @Override
            public void run() {
                log.info("女朋友開(kāi)始準(zhǔn)備禮物~~~~~~~~~~~~");
                try {
                    // 模擬準(zhǔn)備禮物時(shí)間
                    Thread.sleep(6000);
                    String gift = "一個(gè)吻";
                    log.info("女朋友送了禮物: {}",  gift);
                    String recGift = exchanger.exchange(gift);
                    log.info("女朋友收到了禮物: {}",  recGift);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        boy.start();
        girl.start();
        boy.join();
        girl.join();
    }
}

運(yùn)行結(jié)果:

  • 中間阻塞等待了一秒,直到你女朋友也準(zhǔn)備好了禮物。

實(shí)現(xiàn)機(jī)制

實(shí)現(xiàn)機(jī)制也很容易能夠想到,Exchanger類(lèi)中定義一個(gè)槽位slot,

  • A線程交換數(shù)據(jù)時(shí),發(fā)現(xiàn)slot為空,則將需要交換的數(shù)據(jù)放在slot中, 阻塞當(dāng)前線程,等待其它線程進(jìn)來(lái)交換數(shù)據(jù)
  • 等線程B進(jìn)來(lái),讀取A設(shè)置的數(shù)據(jù),然后設(shè)置線程B需要交換的數(shù)據(jù),然后喚醒A線程。

Exchanger的源碼實(shí)現(xiàn)大家感興趣的話,自己可以看看。

總結(jié)

本文講解了交換器Exchanger,是jdk5中引入的一個(gè)同步器。實(shí)際上在平時(shí)工作場(chǎng)景中基本上很少應(yīng)用,按照官方注釋說(shuō)可以應(yīng)用在基因算法或者管道設(shè)計(jì),太抽象了,大家就當(dāng)擴(kuò)擴(kuò)知識(shí)面吧,更多關(guān)于Java JUC交換器Exchanger的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中常見(jiàn)的編碼集問(wèn)題總結(jié)

    Java中常見(jiàn)的編碼集問(wèn)題總結(jié)

    這篇文章主要為大家整理了一些Java中常見(jiàn)的編碼集問(wèn)題,文中的示例代碼講解詳細(xì),對(duì)我們深入理解Java有一定的幫助,感興趣的小伙伴可以了解一下
    2023-02-02
  • Spring Cloud調(diào)用Ribbon的步驟

    Spring Cloud調(diào)用Ribbon的步驟

    Ribbon是Netflix發(fā)布的開(kāi)源項(xiàng)目,主要功能是提供客戶(hù)端的軟件負(fù)載均衡算法和服務(wù)調(diào)用。本文將講述Spring Cloud調(diào)用Ribbon的方法
    2021-05-05
  • 淺談slf4j中的橋接器是如何運(yùn)作的

    淺談slf4j中的橋接器是如何運(yùn)作的

    這篇文章主要介紹了slf4j中的橋接器是如何運(yùn)作的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • springboot詳解實(shí)現(xiàn)車(chē)險(xiǎn)理賠信息管理系統(tǒng)代碼

    springboot詳解實(shí)現(xiàn)車(chē)險(xiǎn)理賠信息管理系統(tǒng)代碼

    本系統(tǒng)基于Springboot開(kāi)發(fā)實(shí)現(xiàn)了一個(gè)為用戶(hù)車(chē)險(xiǎn)進(jìn)行理賠信息管理的一個(gè)信息化管理系統(tǒng),核心的業(yè)務(wù)主要是用戶(hù)申請(qǐng)保險(xiǎn)理賠,管理員審核進(jìn)入理賠程序,事故調(diào)查員對(duì)事故進(jìn)行調(diào)查和現(xiàn)場(chǎng)勘察,這其中共涉及到三類(lèi)用戶(hù),購(gòu)買(mǎi)保險(xiǎn)的客戶(hù),事故調(diào)查員和系統(tǒng)管理員
    2022-06-06
  • Spring使用IOC與DI實(shí)現(xiàn)完全注解開(kāi)發(fā)

    Spring使用IOC與DI實(shí)現(xiàn)完全注解開(kāi)發(fā)

    IOC也是Spring的核心之一了,之前學(xué)的時(shí)候是采用xml配置文件的方式去實(shí)現(xiàn)的,后來(lái)其中也多少穿插了幾個(gè)注解,但是沒(méi)有說(shuō)完全采用注解實(shí)現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來(lái)實(shí)現(xiàn)IOC + DI
    2022-09-09
  • SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢(xún)

    SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢(xún)

    這篇文章主要為大家詳細(xì)介紹了SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢(xún),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作

    springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作

    這篇文章主要介紹了springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作,本文給大家介紹項(xiàng)目場(chǎng)景及解決分析,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Spring中異步注解@Async的使用、原理及使用時(shí)可能導(dǎo)致的問(wèn)題及解決方法

    Spring中異步注解@Async的使用、原理及使用時(shí)可能導(dǎo)致的問(wèn)題及解決方法

    這篇文章主要介紹了Spring中異步注解@Async的使用、原理及使用時(shí)可能導(dǎo)致的問(wèn)題及解決方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot前后端交互、全局異常處理之后端異常信息拋到前端顯示彈窗

    SpringBoot前后端交互、全局異常處理之后端異常信息拋到前端顯示彈窗

    Spring Boot是一個(gè)用于構(gòu)建獨(dú)立的、基于生產(chǎn)級(jí)別的Spring應(yīng)用程序的框架,下面這篇文章主要給大家介紹了關(guān)于SpringBoot前后端交互、全局異常處理之后端異常信息拋到前端顯示彈窗的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Java基礎(chǔ)之方法重寫(xiě)和多態(tài)示例

    Java基礎(chǔ)之方法重寫(xiě)和多態(tài)示例

    這篇文章主要介紹了Java基礎(chǔ)之方法重寫(xiě)和多態(tài),結(jié)合實(shí)例形式分析了java方法重寫(xiě)和多態(tài)的相關(guān)原理與使用技巧,需要的朋友可以參考下
    2019-08-08

最新評(píng)論