溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中TransferQueue的示例分析

發(fā)布時(shí)間:2021-07-22 16:05:43 來源:億速云 閱讀:169 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“java中TransferQueue的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“java中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錯(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

以上是“java中TransferQueue的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI