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

Java中的SynchronousQueue隊列詳解

 更新時間:2023年12月07日 09:00:33   作者:flydean程序那些事  
這篇文章主要介紹了Java中的SynchronousQueue隊列詳解,SynchronousQueue是BlockingQueue的一種,所以SynchronousQueue是線程安全的,SynchronousQueue和其他的BlockingQueue不同的是SynchronousQueue的capacity是0,需要的朋友可以參考下

簡介

SynchronousQueue是BlockingQueue的一種,所以SynchronousQueue是線程安全的。

SynchronousQueue和其他的BlockingQueue不同的是SynchronousQueue的capacity是0。

即SynchronousQueue不存儲任何元素。

也就是說SynchronousQueue的每一次insert操作,必須等待其他線性的remove操作。

而每一個remove操作也必須等待其他線程的insert操作。

這種特性可以讓我們想起了Exchanger。和Exchanger不同的是,使用SynchronousQueue可以在兩個線程中傳遞同一個對象。

一個線程放對象,另外一個線程取對象。

舉例說明

我們舉一個多線程中傳遞對象的例子。

還是舉生產(chǎn)者消費者的例子,在生產(chǎn)者中我們創(chuàng)建一個對象,在消費者中我們?nèi)〕鲞@個對象。

先看一下用CountDownLatch該怎么做:

    @Test
    public void useCountdownLatch() throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        AtomicReference<Object> atomicReference= new AtomicReference<>();
        CountDownLatch countDownLatch = new CountDownLatch(1);

        Runnable producer = () -> {
            Object object=new Object();
            atomicReference.set(object);
            log.info("produced {}",object);
            countDownLatch.countDown();
        };

        Runnable consumer = () -> {
            try {
                countDownLatch.await();
                Object object = atomicReference.get();
                log.info("consumed {}",object);
            } catch (InterruptedException ex) {
                log.error(ex.getMessage(),ex);
            }
        };

        executor.submit(producer);
        executor.submit(consumer);

        executor.awaitTermination(50000, TimeUnit.MILLISECONDS);
        executor.shutdown();
    }

上例中,我們使用AtomicReference來存儲要傳遞的對象,并且定義了一個型號量為1的CountDownLatch。

在producer中,我們存儲對象,并且countDown。

在consumer中,我們await,然后取出對象。

輸出結(jié)果:

[pool-1-thread-1] INFO com.flydean.SynchronousQueueUsage - produced java.lang.Object@683d1b4b
[pool-1-thread-2] INFO com.flydean.SynchronousQueueUsage - consumed java.lang.Object@683d1b4b

可以看到傳入和輸出了同一個對象。

上面的例子我們也可以用SynchronousQueue來改寫:

    @Test
    public void useSynchronousQueue() throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        SynchronousQueue<Object> synchronousQueue=new SynchronousQueue<>();
        Runnable producer = () -> {
            Object object=new Object();
            try {
                synchronousQueue.put(object);
            } catch (InterruptedException ex) {
                log.error(ex.getMessage(),ex);
            }
            log.info("produced {}",object);
        };
        Runnable consumer = () -> {
            try {
                Object object = synchronousQueue.take();
                log.info("consumed {}",object);
            } catch (InterruptedException ex) {
                log.error(ex.getMessage(),ex);
            }
        };
        executor.submit(producer);
        executor.submit(consumer);
        executor.awaitTermination(50000, TimeUnit.MILLISECONDS);
        executor.shutdown();
    }

上面的例子中,如果我們使用synchronousQueue,則可以不用手動同步,也不需要額外的存儲。

總結(jié)

如果我們需要在代碼中用到這種線程中傳遞對象的情況,那么使用synchronousQueue吧。

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

相關(guān)文章

  • SpringBoot環(huán)境下junit單元測試速度優(yōu)化方式

    SpringBoot環(huán)境下junit單元測試速度優(yōu)化方式

    這篇文章主要介紹了SpringBoot環(huán)境下junit單元測試速度優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot配置shiro安全框架的實現(xiàn)

    SpringBoot配置shiro安全框架的實現(xiàn)

    這篇文章主要介紹了SpringBoot配置shiro安全框架的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 如何使用MAVEN打JAR包(直接使用)

    如何使用MAVEN打JAR包(直接使用)

    這篇文章主要介紹了如何使用MAVEN打JAR包(直接使用),文中通過實例代碼介紹了maven?使用assembly插件進(jìn)行打包的方法,需要的朋友可以參考下
    2023-03-03
  • 面向?qū)ο蠛兔嫦蜻^程的區(qū)別(動力節(jié)點java學(xué)院整理)

    面向?qū)ο蠛兔嫦蜻^程的區(qū)別(動力節(jié)點java學(xué)院整理)

    很多朋友不清楚面向?qū)ο蠛兔嫦蜻^程有什么區(qū)別,接下來小編給大家整理了關(guān)于面向?qū)ο蠛兔嫦蜻^程的區(qū)別講解,感興趣的朋友可以參考下
    2017-04-04
  • java中Map和List初始化的N種方法總結(jié)

    java中Map和List初始化的N種方法總結(jié)

    這篇文章主要介紹了java中Map和List初始化的N種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 徹底解決Spring MVC中文亂碼問題的方案

    徹底解決Spring MVC中文亂碼問題的方案

    這篇文章主要介紹了徹底解決Spring MVC中文亂碼問題的方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • Java如何導(dǎo)出包含多個Sheet的Excel文件

    Java如何導(dǎo)出包含多個Sheet的Excel文件

    這篇文章主要為大家詳細(xì)介紹了Java如何導(dǎo)出包含多個Sheet的Excel文件,文中一共介紹了兩種實現(xiàn)方法,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-07-07
  • JavaIO模型中的BIO,NIO和AIO詳解

    JavaIO模型中的BIO,NIO和AIO詳解

    這篇文章主要為大家詳細(xì)介紹了JavaIO模型中的BIO,NIO和AIO,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Spring加載XSD文件發(fā)生錯誤的解決方法

    Spring加載XSD文件發(fā)生錯誤的解決方法

    這篇文章主要介紹了Spring加載XSD文件發(fā)生錯誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot中@Value注入靜態(tài)變量方式

    SpringBoot中@Value注入靜態(tài)變量方式

    SpringBoot中靜態(tài)變量無法直接用@Value注入,需通過setter方法,@Value('${}')從屬性文件獲取值,@Value('#{}')用于SpEL表達(dá)式,可注入其他bean屬性,注意bean默認(rèn)名稱為類名首字母小寫
    2025-08-08

最新評論

奉贤区| 横山县| 绍兴县| 十堰市| 沾化县| 陆川县| 涡阳县| 克山县| 班玛县| 宝清县| 磐石市| 北票市| 纳雍县| 金沙县| 广元市| 哈尔滨市| 哈巴河县| 高唐县| 平定县| 成武县| 临海市| 津南区| 叙永县| 罗甸县| 景宁| 昭平县| 集安市| 石嘴山市| 黔西县| 宣化县| 石渠县| 重庆市| 独山县| 邹城市| 望都县| 九寨沟县| 黄龙县| 漳浦县| 吉安市| 扶绥县| 大丰市|