通過實例了解java TransferQueue
序言
本文主要簡介一下TransferQueue。
TransferQueue
TransferQueue(java7引入)繼承了BlockingQueue(BlockingQueue又繼承了Queue)并擴展了一些新方法。生產(chǎn)者會一直阻塞直到所添加到隊列的元素被某一個消費者所消費(不僅僅是添加到隊列里就完事)。
LinkedTransferQueue
LinkedTransferQueue實際上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因為它不僅僅綜合了這幾個類的功能,同時也提供了更高效的實現(xiàn)。
對比SynchronousQueue
SynchronousQueue使用兩個隊列(一個用于正在等待的生產(chǎn)者、另一個用于正在等待的消費者)和一個用來保護兩個隊列的鎖。而LinkedTransferQueue使用CAS操作實現(xiàn)一個非阻塞的方法,這是避免序列化處理任務的關鍵。
使用場景
當我們不想生產(chǎn)者過度生產(chǎn)消息時,TransferQueue可能非常有用,可避免發(fā)生OutOfMemory錯誤。在這樣的設計中,消費者的消費能力將決定生產(chǎn)者產(chǎn)生消息的速度。
實例
public class LinkedTransferQueueDemo {
static LinkedTransferQueue<String> lnkTransQueue = new LinkedTransferQueue<String>();
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
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Springboot通過ObjectMapper配置json序列化詳解
SpringBoot默認集成Jackson庫,其中ObjectMapper類是核心,用于Java對象與JSON字符串的互轉(zhuǎn),提供配置序列化特性、注冊模塊等方法,在SpringBoot中可以全局配置JSON格式,如日期格式化、將Long轉(zhuǎn)為字符串,還可以配置序列化時的各種規(guī)則,感興趣的可以了解一下2024-10-10
當面試官問我ArrayList和LinkedList哪個更占空間時,我是這么答的(面試官必問)
今天介紹一下Java的兩個集合類,ArrayList和LinkedList,這兩個集合的知識點幾乎可以說面試必問的。感興趣的朋友跟隨小編一起看看吧2020-08-08
Mybatis傳遞多個參數(shù)的三種實現(xiàn)方法
這篇文章主要介紹了Mybatis傳遞多個參數(shù)的三種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04
基于servlet的執(zhí)行原理與生命周期(全面解析)
下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12

