欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过实例了解java TransferQueue

程序员文章站 2023-11-17 11:32:46
序言 本文主要简介一下transferqueue。 transferqueue transferqueue(java7引入)继承了blockingqueue(...

序言

本文主要简介一下transferqueue。

transferqueue

transferqueue(java7引入)继承了blockingqueue(blockingqueue又继承了queue)并扩展了一些新方法。生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费(不仅仅是添加到队列里就完事)。

linkedtransferqueue

linkedtransferqueue实际上是concurrentlinkedqueue、synchronousqueue(公平模式)和linkedblockingqueue的超集。而且linkedtransferqueue更好用,因为它不仅仅综合了这几个类的功能,同时也提供了更高效的实现。

对比synchronousqueue

synchronousqueue使用两个队列(一个用于正在等待的生产者、另一个用于正在等待的消费者)和一个用来保护两个队列的锁。而linkedtransferqueue使用cas操作实现一个非阻塞的方法,这是避免序列化处理任务的关键。

使用场景

当我们不想生产者过度生产消息时,transferqueue可能非常有用,可避免发生outofmemory错误。在这样的设计中,消费者的消费能力将决定生产者产生消息的速度。

实例

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。