通過(guò)實(shí)例了解java TransferQueue
序言
本文主要簡(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è)類(lèi)的功能,同時(shí)也提供了更高效的實(shí)現(xiàn)。
對(duì)比SynchronousQueue
SynchronousQueue使用兩個(gè)隊(duì)列(一個(gè)用于正在等待的生產(chǎn)者、另一個(gè)用于正在等待的消費(fèi)者)和一個(gè)用來(lái)保護(hù)兩個(gè)隊(duì)列的鎖。而LinkedTransferQueue使用CAS操作實(shí)現(xiàn)一個(gè)非阻塞的方法,這是避免序列化處理任務(wù)的關(guān)鍵。
使用場(chǎng)景
當(dāng)我們不想生產(chǎn)者過(guò)度生產(chǎn)消息時(shí),TransferQueue可能非常有用,可避免發(fā)生OutOfMemory錯(cuò)誤。在這樣的設(shè)計(jì)中,消費(fèi)者的消費(fèi)能力將決定生產(chǎn)者產(chǎn)生消息的速度。
實(shí)例
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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot通過(guò)ObjectMapper配置json序列化詳解
SpringBoot默認(rèn)集成Jackson庫(kù),其中ObjectMapper類(lèi)是核心,用于Java對(duì)象與JSON字符串的互轉(zhuǎn),提供配置序列化特性、注冊(cè)模塊等方法,在SpringBoot中可以全局配置JSON格式,如日期格式化、將Long轉(zhuǎn)為字符串,還可以配置序列化時(shí)的各種規(guī)則,感興趣的可以了解一下2024-10-10
當(dāng)面試官問(wèn)我ArrayList和LinkedList哪個(gè)更占空間時(shí),我是這么答的(面試官必問(wèn))
今天介紹一下Java的兩個(gè)集合類(lèi),ArrayList和LinkedList,這兩個(gè)集合的知識(shí)點(diǎn)幾乎可以說(shuō)面試必問(wèn)的。感興趣的朋友跟隨小編一起看看吧2020-08-08
Mybatis傳遞多個(gè)參數(shù)的三種實(shí)現(xiàn)方法
這篇文章主要介紹了Mybatis傳遞多個(gè)參數(shù)的三種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
基于servlet的執(zhí)行原理與生命周期(全面解析)
下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12

