成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

TransferQueue實(shí)例

MarvinZhang / 3277人閱讀

摘要:實(shí)際上是公平模式和的超集。而使用操作實(shí)現(xiàn)一個(gè)非阻塞的方法,這是避免序列化處理任務(wù)的關(guān)鍵。在這樣的設(shè)計(jì)中,消費(fèi)者的消費(fèi)能力將決定生產(chǎn)者產(chǎn)生消息的速度。實(shí)例輸出中的模式手記之似懂非懂的和長(zhǎng)度為的

本文主要簡(jiǎn)介一下TransferQueue。

TransferQueue

TransferQueue(java7引入)繼承了BlockingQueue(BlockingQueue又繼承了Queue)并擴(kuò)展了一些新方法。生產(chǎn)者會(huì)一直阻塞直到所添加到隊(duì)列的元素被某一個(gè)消費(fèi)者所消費(fèi)(不僅僅是添加到隊(duì)列里就完事)。

LinkedTransferQueue

LinkedTransferQueue實(shí)際上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因?yàn)樗粌H僅綜合了這幾個(gè)類的功能,同時(shí)也提供了更高效的實(shí)現(xiàn)。

對(duì)比SynchronousQueue

SynchronousQueue使用兩個(gè)隊(duì)列(一個(gè)用于正在等待的生產(chǎn)者、另一個(gè)用于正在等待的消費(fèi)者)和一個(gè)用來保護(hù)兩個(gè)隊(duì)列的鎖。而LinkedTransferQueue使用CAS操作實(shí)現(xiàn)一個(gè)非阻塞的方法,這是避免序列化處理任務(wù)的關(guān)鍵。

使用場(chǎng)景

當(dāng)我們不想生產(chǎn)者過度生產(chǎn)消息時(shí),TransferQueue可能非常有用,可避免發(fā)生OutOfMemory錯(cuò)誤。在這樣的設(shè)計(jì)中,消費(fèi)者的消費(fèi)能力將決定生產(chǎn)者產(chǎn)生消息的速度。

實(shí)例
public class LinkedTransferQueueDemo {
    static LinkedTransferQueue lnkTransQueue = new LinkedTransferQueue();
    public static void main(String[] args) {
        ExecutorService exService = Executors.newFixedThreadPool(2);
        Producer producer = new LinkedTransferQueueDemo().new Producer();
        Consumer consumer = new LinkedTransferQueueDemo().new Consumer();
        exService.execute(producer);
        exService.execute(consumer);
        exService.shutdown();
    }
    class Producer implements Runnable{
        @Override
        public void run() {
            for(int i=0;i<3;i++){
                try {
                    System.out.println("Producer is waiting to transfer...");
                    lnkTransQueue.transfer("A"+i);
                    System.out.println("producer transfered element: A"+i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    class Consumer implements Runnable{
        @Override
        public void run() {
            for(int i=0;i<3;i++){
                try {
                    System.out.println("Consumer is waiting to take element...");
                    String s= lnkTransQueue.take();
                    System.out.println("Consumer received Element: "+s);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

輸出

Producer is waiting to transfer...
Consumer is waiting to take element...
producer transfered element: A0
Producer is waiting to transfer...
Consumer received Element: A0
Consumer is waiting to take element...
producer transfered element: A1
Producer is waiting to transfer...
Consumer received Element: A1
Consumer is waiting to take element...
Consumer received Element: A2
producer transfered element: A2
doc

Java 7中的TransferQueue

Guide to the Java TransferQueue

TransferQueue and LinkedTransferQueue Java Example

Java TransferQueue

Fork/Join模式(JSR166y)手記之TransferQueue/LinkedTransferQueue

似懂非懂的SynchronousQueue和長(zhǎng)度為1的BlockingQueue

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/70498.html

相關(guān)文章

  • Java多線程進(jìn)階(三五)—— J.U.C之collections框架:SynchronousQue

    摘要:三總結(jié)主要用于線程之間的數(shù)據(jù)交換,由于采用無鎖算法,其性能一般比單純的其它阻塞隊(duì)列要高。它的最大特點(diǎn)時(shí)不存儲(chǔ)實(shí)際元素,而是在內(nèi)部通過?;蜿?duì)列結(jié)構(gòu)保存阻塞線程。 showImg(https://segmentfault.com/img/bVbgOsh?w=900&h=900); 本文首發(fā)于一世流云專欄:https://segmentfault.com/blog... 一、Synchro...

    missonce 評(píng)論0 收藏0
  • 圖解SynchronousQueue原理詳解-公平模式

    摘要:如果節(jié)點(diǎn)不為說明已經(jīng)有其他線程進(jìn)行操作將節(jié)點(diǎn)替換為節(jié)點(diǎn)等待有消費(fèi)者消費(fèi)線程。如果頭節(jié)點(diǎn)下一個(gè)節(jié)點(diǎn)是當(dāng)前節(jié)點(diǎn)以防止其他線程已經(jīng)修改了節(jié)點(diǎn)則運(yùn)算,否則直接返回。 一、介紹 SynchronousQueue是一個(gè)雙棧雙隊(duì)列算法,無空間的隊(duì)列或棧,任何一個(gè)對(duì)SynchronousQueue寫需要等到一個(gè)對(duì)SynchronousQueue的讀操作,反之亦然。一個(gè)讀操作需要等待一個(gè)寫操作,相當(dāng)于是...

    jifei 評(píng)論0 收藏0
  • Java多線程進(jìn)階(三八)—— J.U.C之collections框架:LinkedTransfer

    摘要:當(dāng)生產(chǎn)者線程調(diào)用方法時(shí),如果沒有消費(fèi)者等待接收元素,則會(huì)立即返回。方法方法,用于將指定元素傳遞給消費(fèi)者線程調(diào)用方法。 showImg(https://segmentfault.com/img/bVbheod?w=1800&h=1000); 本文首發(fā)于一世流云專欄:https://segmentfault.com/blog... 一、LinkedTransferQueue簡(jiǎn)介 Link...

    ghnor 評(píng)論0 收藏0
  • 使用 Executors,ThreadPoolExecutor,創(chuàng)建線程池,源碼分析理解

    摘要:源碼分析創(chuàng)建可緩沖的線程池。源碼分析使用創(chuàng)建線程池源碼分析的構(gòu)造函數(shù)構(gòu)造函數(shù)參數(shù)核心線程數(shù)大小,當(dāng)線程數(shù),會(huì)創(chuàng)建線程執(zhí)行最大線程數(shù),當(dāng)線程數(shù)的時(shí)候,會(huì)把放入中保持存活時(shí)間,當(dāng)線程數(shù)大于的空閑線程能保持的最大時(shí)間。 之前創(chuàng)建線程的時(shí)候都是用的 newCachedThreadPoo,newFixedThreadPool,newScheduledThreadPool,newSingleThr...

    Chiclaim 評(píng)論0 收藏0
  • 解讀 Java 并發(fā)隊(duì)列 BlockingQueue

    摘要:如果隊(duì)列已滿,這個(gè)時(shí)候?qū)懖僮鞯木€程進(jìn)入到寫線程隊(duì)列排隊(duì),等待讀線程將隊(duì)列元素移除騰出空間,然后喚醒寫線程隊(duì)列的第一個(gè)等待線程。數(shù)據(jù)必須從某個(gè)寫線程交給某個(gè)讀線程,而不是寫到某個(gè)隊(duì)列中等待被消費(fèi)。 前言 本文直接參考 Doug Lea 寫的 Java doc 和注釋,這也是我們?cè)趯W(xué)習(xí) java 并發(fā)包時(shí)最好的材料了。希望大家能有所思、有所悟,學(xué)習(xí) Doug Lea 的代碼風(fēng)格,并將其優(yōu)雅...

    maochunguang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<