摘要:實際上是公平模式和的超集。而使用操作實現一個非阻塞的方法,這是避免序列化處理任務的關鍵。在這樣的設計中,消費者的消費能力將決定生產者產生消息的速度。實例輸出中的模式手記之似懂非懂的和長度為的
序
本文主要簡介一下TransferQueue。
TransferQueueTransferQueue(java7引入)繼承了BlockingQueue(BlockingQueue又繼承了Queue)并擴展了一些新方法。生產者會一直阻塞直到所添加到隊列的元素被某一個消費者所消費(不僅僅是添加到隊列里就完事)。
LinkedTransferQueueLinkedTransferQueue實際上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因為它不僅僅綜合了這幾個類的功能,同時也提供了更高效的實現。
對比SynchronousQueueSynchronousQueue使用兩個隊列(一個用于正在等待的生產者、另一個用于正在等待的消費者)和一個用來保護兩個隊列的鎖。而LinkedTransferQueue使用CAS操作實現一個非阻塞的方法,這是避免序列化處理任務的關鍵。
使用場景當我們不想生產者過度生產消息時,TransferQueue可能非常有用,可避免發生OutOfMemory錯誤。在這樣的設計中,消費者的消費能力將決定生產者產生消息的速度。
實例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和長度為1的BlockingQueue
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70498.html
摘要:三總結主要用于線程之間的數據交換,由于采用無鎖算法,其性能一般比單純的其它阻塞隊列要高。它的最大特點時不存儲實際元素,而是在內部通過?;蜿犃薪Y構保存阻塞線程。 showImg(https://segmentfault.com/img/bVbgOsh?w=900&h=900); 本文首發于一世流云專欄:https://segmentfault.com/blog... 一、Synchro...
摘要:如果節點不為說明已經有其他線程進行操作將節點替換為節點等待有消費者消費線程。如果頭節點下一個節點是當前節點以防止其他線程已經修改了節點則運算,否則直接返回。 一、介紹 SynchronousQueue是一個雙棧雙隊列算法,無空間的隊列或棧,任何一個對SynchronousQueue寫需要等到一個對SynchronousQueue的讀操作,反之亦然。一個讀操作需要等待一個寫操作,相當于是...
摘要:當生產者線程調用方法時,如果沒有消費者等待接收元素,則會立即返回。方法方法,用于將指定元素傳遞給消費者線程調用方法。 showImg(https://segmentfault.com/img/bVbheod?w=1800&h=1000); 本文首發于一世流云專欄:https://segmentfault.com/blog... 一、LinkedTransferQueue簡介 Link...
摘要:源碼分析創建可緩沖的線程池。源碼分析使用創建線程池源碼分析的構造函數構造函數參數核心線程數大小,當線程數,會創建線程執行最大線程數,當線程數的時候,會把放入中保持存活時間,當線程數大于的空閑線程能保持的最大時間。 之前創建線程的時候都是用的 newCachedThreadPoo,newFixedThreadPool,newScheduledThreadPool,newSingleThr...
摘要:如果隊列已滿,這個時候寫操作的線程進入到寫線程隊列排隊,等待讀線程將隊列元素移除騰出空間,然后喚醒寫線程隊列的第一個等待線程。數據必須從某個寫線程交給某個讀線程,而不是寫到某個隊列中等待被消費。 前言 本文直接參考 Doug Lea 寫的 Java doc 和注釋,這也是我們在學習 java 并發包時最好的材料了。希望大家能有所思、有所悟,學習 Doug Lea 的代碼風格,并將其優雅...
閱讀 768·2021-09-26 09:55
閱讀 2058·2021-09-22 15:44
閱讀 1473·2019-08-30 15:54
閱讀 1324·2019-08-30 15:54
閱讀 2668·2019-08-29 16:57
閱讀 517·2019-08-29 16:26
閱讀 2490·2019-08-29 15:38
閱讀 2122·2019-08-26 11:48