摘要:實(shí)際上是公平模式和的超集。而使用操作實(shí)現(xiàn)一個(gè)非阻塞的方法,這是避免序列化處理任務(wù)的關(guān)鍵。在這樣的設(shè)計(jì)中,消費(fèi)者的消費(fèi)能力將決定生產(chǎn)者產(chǎn)生消息的速度。實(shí)例輸出中的模式手記之似懂非懂的和長(zhǎng)度為的
序
本文主要簡(jiǎn)介一下TransferQueue。
TransferQueueTransferQueue(java7引入)繼承了BlockingQueue(BlockingQueue又繼承了Queue)并擴(kuò)展了一些新方法。生產(chǎn)者會(huì)一直阻塞直到所添加到隊(duì)列的元素被某一個(gè)消費(fèi)者所消費(fèi)(不僅僅是添加到隊(duì)列里就完事)。
LinkedTransferQueueLinkedTransferQueue實(shí)際上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因?yàn)樗粌H僅綜合了這幾個(gè)類的功能,同時(shí)也提供了更高效的實(shí)現(xiàn)。
對(duì)比SynchronousQueueSynchronousQueue使用兩個(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 LinkedTransferQueuelnkTransQueue = 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: A2doc
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
摘要:三總結(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...
摘要:如果節(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)于是...
摘要:當(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...
摘要:源碼分析創(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...
摘要:如果隊(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)雅...
閱讀 891·2021-09-26 09:55
閱讀 2160·2021-09-22 15:44
閱讀 1558·2019-08-30 15:54
閱讀 1403·2019-08-30 15:54
閱讀 2747·2019-08-29 16:57
閱讀 585·2019-08-29 16:26
閱讀 2563·2019-08-29 15:38
閱讀 2212·2019-08-26 11:48