序
本文主要簡介一下TransferQueue合砂。
TransferQueue
TransferQueue(java7引入
)繼承了BlockingQueue(BlockingQueue又繼承了Queue)并擴(kuò)展了一些新方法啦膜。生產(chǎn)者會一直阻塞直到所添加到隊(duì)列的元素被某一個(gè)消費(fèi)者所消費(fèi)(不僅僅是添加到隊(duì)列里就完事)昌讲。
LinkedTransferQueue
LinkedTransferQueue實(shí)際上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集菱鸥。而且LinkedTransferQueue更好用铆帽,因?yàn)樗粌H僅綜合了這幾個(gè)類的功能胞枕,同時(shí)也提供了更高效的實(shí)現(xiàn)压真。
對比SynchronousQueue
SynchronousQueue使用兩個(gè)隊(duì)列(一個(gè)用于正在等待的生產(chǎn)者娩嚼、另一個(gè)用于正在等待的消費(fèi)者)和一個(gè)用來保護(hù)兩個(gè)隊(duì)列的鎖。而LinkedTransferQueue使用CAS操作實(shí)現(xiàn)一個(gè)非阻塞的方法榴都,這是避免序列化處理任務(wù)的關(guān)鍵待锈。
使用場景
當(dāng)我們不想生產(chǎn)者過度生產(chǎn)消息時(shí),TransferQueue可能非常有用嘴高,可避免發(fā)生OutOfMemory錯誤竿音。在這樣的設(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