通过实例了解java TransferQueue

 更新时间:2019年05月28日 14:15:15   作者:codecraft  
这篇文章主要介绍了TransferQueue实例,下面小编和大家一起来学习一下

序言

本文主要简介一下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

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

相关文章

  • IDEA 卡住buid(编译)不动的解决办法

    IDEA 卡住buid(编译)不动的解决办法

    这篇文章主要介绍了IDEA 卡住buid(编译)不动的解决办法(适用于maven和gradle)及定位思路,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Springboot通过ObjectMapper配置json序列化详解

    Springboot通过ObjectMapper配置json序列化详解

    SpringBoot默认集成Jackson库,其中ObjectMapper类是核心,用于Java对象与JSON字符串的互转,提供配置序列化特性、注册模块等方法,在SpringBoot中可以全局配置JSON格式,如日期格式化、将Long转为字符串,还可以配置序列化时的各种规则,感兴趣的可以了解一下
    2024-10-10
  • 当面试官问我ArrayList和LinkedList哪个更占空间时,我是这么答的(面试官必问)

    当面试官问我ArrayList和LinkedList哪个更占空间时,我是这么答的(面试官必问)

    今天介绍一下Java的两个集合类,ArrayList和LinkedList,这两个集合的知识点几乎可以说面试必问的。感兴趣的朋友跟随小编一起看看吧
    2020-08-08
  • Mybatis传递多个参数的三种实现方法

    Mybatis传递多个参数的三种实现方法

    这篇文章主要介绍了Mybatis传递多个参数的三种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 多线程下怎样保证OkHttpClient的线程安全

    多线程下怎样保证OkHttpClient的线程安全

    这篇文章主要介绍了多线程下怎样保证OkHttpClient的线程安全问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java利用Calendar类打印日历

    java利用Calendar类打印日历

    这篇文章主要为大家详细介绍了java利用Calendar类打印日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 基于servlet的执行原理与生命周期(全面解析)

    基于servlet的执行原理与生命周期(全面解析)

    下面小编就为大家分享一篇servlet的执行原理与生命周期全面解析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java面试突击之Bean作用域详解

    Java面试突击之Bean作用域详解

    Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看
    2022-08-08
  • Java设计模式中的外观模式详解

    Java设计模式中的外观模式详解

    外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节。本文将通过示例详细为大家讲解一下外观模式,需要的可以参考一下
    2023-02-02
  • DispatcherServlet处理器的适配和处理解析

    DispatcherServlet处理器的适配和处理解析

    这篇文章主要为大家介绍了DispatcherServlet的处理器的适配和处理流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论