资讯专栏INFORMATION COLUMN

TransferQueue实例

MarvinZhang / 3171人阅读

摘要:实际上是公平模式和的超集。而使用操作实现一个非阻塞的方法,这是避免序列化处理任务的关键。在这样的设计中,消费者的消费能力将决定生产者产生消息的速度。实例输出中的模式手记之似懂非懂的和长度为的

本文主要简介一下TransferQueue。

TransferQueue

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

LinkedTransferQueue

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

对比SynchronousQueue

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

使用场景

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

实例
public class LinkedTransferQueueDemo {
    static LinkedTransferQueue lnkTransQueue = new LinkedTransferQueue();
    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
doc

Java 7中的TransferQueue

Guide to the Java TransferQueue

TransferQueue and LinkedTransferQueue Java Example

Java TransferQueue

Fork/Join模式(JSR166y)手记之TransferQueue/LinkedTransferQueue

似懂非懂的SynchronousQueue和长度为1的BlockingQueue

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70498.html

相关文章

  • Java多线程进阶(三五)—— J.U.C之collections框架:SynchronousQue

    摘要:三总结主要用于线程之间的数据交换,由于采用无锁算法,其性能一般比单纯的其它阻塞队列要高。它的最大特点时不存储实际元素,而是在内部通过栈或队列结构保存阻塞线程。 showImg(https://segmentfault.com/img/bVbgOsh?w=900&h=900); 本文首发于一世流云专栏:https://segmentfault.com/blog... 一、Synchro...

    missonce 评论0 收藏0
  • 图解SynchronousQueue原理详解-公平模式

    摘要:如果节点不为说明已经有其他线程进行操作将节点替换为节点等待有消费者消费线程。如果头节点下一个节点是当前节点以防止其他线程已经修改了节点则运算,否则直接返回。 一、介绍 SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对SynchronousQueue的读操作,反之亦然。一个读操作需要等待一个写操作,相当于是...

    jifei 评论0 收藏0
  • Java多线程进阶(三八)—— J.U.C之collections框架:LinkedTransfer

    摘要:当生产者线程调用方法时,如果没有消费者等待接收元素,则会立即返回。方法方法,用于将指定元素传递给消费者线程调用方法。 showImg(https://segmentfault.com/img/bVbheod?w=1800&h=1000); 本文首发于一世流云专栏:https://segmentfault.com/blog... 一、LinkedTransferQueue简介 Link...

    ghnor 评论0 收藏0
  • 使用 Executors,ThreadPoolExecutor,创建线程池,源码分析理解

    摘要:源码分析创建可缓冲的线程池。源码分析使用创建线程池源码分析的构造函数构造函数参数核心线程数大小,当线程数,会创建线程执行最大线程数,当线程数的时候,会把放入中保持存活时间,当线程数大于的空闲线程能保持的最大时间。 之前创建线程的时候都是用的 newCachedThreadPoo,newFixedThreadPool,newScheduledThreadPool,newSingleThr...

    Chiclaim 评论0 收藏0
  • 解读 Java 并发队列 BlockingQueue

    摘要:如果队列已满,这个时候写操作的线程进入到写线程队列排队,等待读线程将队列元素移除腾出空间,然后唤醒写线程队列的第一个等待线程。数据必须从某个写线程交给某个读线程,而不是写到某个队列中等待被消费。 前言 本文直接参考 Doug Lea 写的 Java doc 和注释,这也是我们在学习 java 并发包时最好的材料了。希望大家能有所思、有所悟,学习 Doug Lea 的代码风格,并将其优雅...

    maochunguang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<