Java中常用的七种队列你了解多少?

news2024/9/24 7:03:20

文章目录

    • Java中常用的七种队列你了解多少?
    • ArrayBlockingQueue队列如何使用?
      • 添加元素到队列
      • 获取队列中的元素
      • 遍历队列
    • LinkedBlockingQueue队列如何使用?
      • 1. 创建SynchronousQueue对象
      • 2. 添加元素到队列
      • 3. 获取队列中的元素
      • 4. 遍历队列
    • SynchronousQueue队列如何使用?
      • 创建SynchronousQueue对象
      • 添加元素到队列
      • 获取队列中的元素
      • 遍历队列
    • LinkedTransferQueue队列如何使用?
      • 1. 创建LinkedTransferQueue对象
      • 2. 添加元素到队列
      • 3. 获取队列中的元素
      • 4. 遍历队列
    • ConcurrentLinkedQueue队列如何使用?
      • 1. 创建DelayQueue对象
      • 2. 添加元素到DelayQueue
      • 3. 获取DelayQueue中的元素
      • 4. 自定义元素类
    • DelayQueue队列如何使用?
      • 创建DelayQueue对象
      • 添加元素到DelayQueue
      • 获取DelayQueue中的元素
    • 总结:
  • 结语

Java中常用的七种队列你了解多少?

Java中常用的队列有以下几种:

  1. ArrayBlockingQueue:一个基于数组结构的有界阻塞队列,按照先进先出的原则对元素进行排序。
  2. LinkedBlockingQueue:一个基于链表结构的有界阻塞队列,按照先进先出的原则对元素进行排序。
  3. PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
  4. DelayQueue:一个支持延时获取元素的无界阻塞队列。
  5. SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作,否则插入操作一直处于阻塞状态。
  6. LinkedTransferQueue:一个基于链表结构的无界阻塞队列,支持生产者消费者模式。
  7. ConcurrentLinkedQueue:一个基于链表结构的无界并发队列,按照先进先出的原则对元素进行排序。

这些队列都实现了Queue接口或其子接口,可以根据不同的场景和需求选择合适的队列。在并发场景下,应当注意队列的线程安全性以及对并发操作的支持程度。

ArrayBlockingQueue队列如何使用?

ArrayBlockingQueue是Java中的一个线程安全的队列,它是一种基于数组实现的有界队列。下面介绍一下ArrayBlockingQueue队列的使用方法。

创建ArrayBlockingQueue对象
可以使用new关键字创建ArrayBlockingQueue对象。

ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(capacity);

其中,capacity参数表示队列的容量。

添加元素到队列

可以使用add方法向队列中添加元素,如果队列已满,则会抛出IllegalStateException异常。

queue.add("wx:libin9iOak");  

也可以使用offer方法向队列中添加元素,如果队列已满,则返回false。

boolean result = queue.offer("wx:libin9iOak");

还可以使用put方法向队列中添加元素,如果队列已满,则当前线程会被阻塞,直到有其他线程从队列中删除元素。

queue.put("wx:libin9iOak");

获取队列中的元素

可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有其他线程向队列中添加元素。

String element = queue.take();

也可以使用poll方法获取队列中的元素,如果队列为空,则返回null。

String element = queue.poll();

还可以使用poll方法设置超时时间,如果在指定的时间内没有获取到元素,则返回null。

String element = queue.poll(timeout, unit);

遍历队列

可以使用迭代器遍历队列中的元素。

Iterator<String> iterator = queue.iterator();
while(iterator.hasNext()) {
   String element = iterator.next();
   // do something with the element
}

也可以使用for-each循环遍历队列中的元素。

for(String element : queue) {
   // do something with the element
}

ArrayBlockingQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。同时,由于它是一种有界队列,因此在使用时需要注意队列的容量,以免发生队列溢出。

LinkedBlockingQueue队列如何使用?

SynchronousQueue是Java中的一个线程安全的队列,它是一种没有缓冲的队列,其中每个插入操作必须等待另一个线程的删除操作,反之亦然。下面介绍一下SynchronousQueue队列的使用方法。

1. 创建SynchronousQueue对象

可以使用new关键字创建SynchronousQueue对象。

 
SynchronousQueue<String> queue = new SynchronousQueue<>();

2. 添加元素到队列

SynchronousQueue是一种没有缓冲的队列,因此不能直接将元素添加到队列中。它的插入操作必须等待另一个线程的删除操作。可以使用put方法向队列中添加元素,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。

 
queue.put("wx:libin9iOak");

3. 获取队列中的元素

可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。

 
String element = queue.take();

4. 遍历队列

SynchronousQueue是一种没有缓冲的队列,因此不支持遍历操作。

SynchronousQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。但是需要注意的是,由于它是一种没有缓冲的队列,因此在使用时需要确保生产者线程和消费者线程之间的数量平衡,否则可能会导致线程阻塞或队列溢出。

Regenerate response

SynchronousQueue队列如何使用?

SynchronousQueue是Java中的一个线程安全的队列,它是一种没有缓冲的队列,其中每个插入操作必须等待另一个线程的删除操作,反之亦然。下面介绍一下SynchronousQueue队列的使用方法。

创建SynchronousQueue对象

可以使用new关键字创建SynchronousQueue对象。

 ```

SynchronousQueue queue = new SynchronousQueue<>();
```

添加元素到队列

SynchronousQueue是一种没有缓冲的队列,因此不能直接将元素添加到队列中。它的插入操作必须等待另一个线程的删除操作。可以使用put方法向队列中添加元素,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。

 ```

queue.put(“wx:libin9iOak”);
```

获取队列中的元素

可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。

 ```

String element = queue.take();
```

遍历队列

SynchronousQueue是一种没有缓冲的队列,因此不支持遍历操作。

SynchronousQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。但是需要注意的是,由于它是一种没有缓冲的队列,因此在使用时需要确保生产者线程和消费者线程之间的数量平衡,否则可能会导致线程阻塞或队列溢出。

LinkedTransferQueue队列如何使用?

LinkedTransferQueue是Java中的一个线程安全的队列,它是基于链表实现的无界队列,支持高效的并发访问。相比于ConcurrentLinkedQueue,它多了一种阻塞等待的机制。下面介绍一下LinkedTransferQueue队列的使用方法。

1. 创建LinkedTransferQueue对象

可以使用new关键字创建LinkedTransferQueue对象。

          
LinkedTransferQueue<String> queue = new LinkedTransferQueue<>();

2. 添加元素到队列

可以使用add、offer或transfer方法将元素添加到队列中。

  queue.add("wx:libin9iOak");
queue.offer("weix:libin9iOak");
queue.transfer("element3");

其中,add方法在队列已满时会抛出异常,而offer方法则会返回false。而transfer方法则是一种阻塞等待的机制,它会将元素立即转移给等待的消费者线程,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。

3. 获取队列中的元素

可以使用poll方法获取队列中的元素,如果队列为空,则返回null。

          
String element = queue.poll();

也可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。

          
String element = queue.take();

4. 遍历队列

可以使用forEach方法遍历队列中的元素。

          
queue.forEach(System.out::println);

也可以使用迭代器遍历队列中的元素。

          Iterator<String> iterator = queue.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

LinkedTransferQueue支持高效的并发访问,并且它提供了一种阻塞等待的机制,可以更加灵活地控制线程之间的交互。但是需要注意的是,由于它是基于链表实现的,因此在进行遍历或删除操作时,需要注意多线程并发修改的问题。

ConcurrentLinkedQueue队列如何使用?

DelayQueue是Java中的一个阻塞队列,它可以支持延时获取元素的功能。在DelayQueue中,每个元素都有一个过期时间,只有当元素的过期时间到了才能被获取,否则元素一直处于阻塞状态。下面介绍一下DelayQueue队列的使用方法。

1. 创建DelayQueue对象

可以使用new关键字或者工具类Executors创建DelayQueue对象。

     
DelayQueue<MyDelayedElement> delayQueue = new DelayQueue<>();

其中MyDelayedElement是自定义的实现了Delayed接口的元素类,实现getDelay方法用于返回元素的过期时间。

2. 添加元素到DelayQueue

可以使用add或offer方法将元素添加到DelayQueue中。

     delayQueue.add(new MyDelayedElement("wx:libin9iOak", 1000));
delayQueue.offer(new MyDelayedElement("weix:libin9iOak", 2000));

其中,第二个参数是元素的过期时间,单位为毫秒。

3. 获取DelayQueue中的元素

可以使用take方法获取DelayQueue中的元素,如果没有可用的元素,则线程会一直处于阻塞状态。

     
MyDelayedElement element = delayQueue.take();

也可以使用poll方法获取DelayQueue中的元素,如果没有可用的元素,则返回null。

     
MyDelayedElement element = delayQueue.poll();

4. 自定义元素类

MyDelayedElement是一个自定义的实现了Delayed接口的元素类,下面是一个简单的示例代码。

     public class MyDelayedElement implements Delayed {
    private String name; // 元素名称
    private long expireTime; // 过期时间

    public MyDelayedElement(String name, long delay) {
        this.name = name;
        this.expireTime = System.currentTimeMillis() + delay;
    }

    // 获取元素的过期时间
    @Override
    public long getDelay(TimeUnit unit) {
        long diff = expireTime - System.currentTimeMillis();
        return unit.convert(diff, TimeUnit.MILLISECONDS);
    }

    // 按照过期时间排序
    @Override
    public int compareTo(Delayed other) {
        long diff = this.getDelay(TimeUnit.MILLISECONDS) - other.getDelay(TimeUnit.MILLISECONDS);
        return Long.compare(diff, 0);
    }

    // 元素业务逻辑
    public void doBusiness() {
        System.out.println("Element " + name + " has expired");
    }
}

在上面的示例代码中,元素的过期时间是由创建元素时指定的delay参数和当前时间计算得出的。在getDelay方法中,返回元素的过期时间与指定时间单位的差值,这个差值会用于元素的排序。在compareTo方法中,按照过期时间从小到大排序。在doBusiness方法中,执行元素的业务逻辑。

总之,DelayQueue可以用于实现一些延时操作,例如定时任务调度、缓存失效等。在使用时,需要注意元素的过期时间和业务逻辑的处理。

DelayQueue队列如何使用?

DelayQueue是Java中的一个阻塞队列,它可以支持延时获取元素的功能。在DelayQueue中,每个元素都有一个过期时间,只有当元素的过期时间到了才能被获取,否则元素一直处于阻塞状态。下面介绍一下DelayQueue队列的使用方法。

创建DelayQueue对象

可以使用new关键字或者工具类Executors创建DelayQueue对象。

DelayQueue<MyDelayedElement> delayQueue = new DelayQueue<>();

其中MyDelayedElement是自定义的实现了Delayed接口的元素类,实现getDelay方法用于返回元素的过期时间。

添加元素到DelayQueue

可以使用add或offer方法将元素添加到DelayQueue中。

delayQueue.add(new MyDelayedElement("wx:libin9iOak", 1000));
delayQueue.offer(new MyDelayedElement("weix:libin9iOak", 2000));

其中,第二个参数是元素的过期时间,单位为毫秒。

获取DelayQueue中的元素

可以使用take方法获取DelayQueue中的元素,如果没有可用的元素,则线程会一直处于阻塞状态。

MyDelayedElement element = delayQueue.take();

也可以使用poll方法获取DelayQueue中的元素,如果没有可用的元素,则返回null。

MyDelayedElement element = delayQueue.poll();

自定义元素类
MyDelayedElement是一个自定义的实现了Delayed接口的元素类,下面是一个简单的示例代码。


public class MyDelayedElement implements Delayed {
   private String name; // 元素名称
   private long expireTime; // 过期时间




   public MyDelayedElement(String name, long delay) {
       this.name = name;
       this.expireTime = System.currentTimeMillis() + delay;
   }
   
   // 获取元素的过期时间
   @Override
   public long getDelay(TimeUnit unit) {
       long diff = expireTime - System.currentTimeMillis();
       return unit.convert(diff, TimeUnit.MILLISECONDS);
   }
   
   // 按照过期时间排序
   @Override
   public int compareTo(Delayed other) {
       long diff = this.getDelay(TimeUnit.MILLISECONDS) - other.getDelay(TimeUnit.MILLISECONDS);
       return Long.compare(diff, 0);
   }
   
   // 元素业务逻辑
   public void doBusiness() {
       System.out.println("Element " + name + " has expired");
   }

}

在上面的示例代码中,元素的过期时间是由创建元素时指定的delay参数和当前时间计算得出的。在getDelay方法中,返回元素的过期时间与指定时间单位的差值,这个差值会用于元素的排序。在compareTo方法中,按照过期时间从小到大排序。在doBusiness方法中,执行元素的业务逻辑。

总之,DelayQueue可以用于实现一些延时操作,例如定时任务调度、缓存失效等。在使用时,需要注意元素的过期时间和业务逻辑的处理。

总结:

ArrayBlockingQueue是一种有界队列,它可以设定最大容量,当队列满时,新增元素会被阻塞;LinkedBlockingQueue是一种无界队列,它将新增元素放在队列的尾部,获取元素时从队列的头部开始获取;PriorityBlockingQueue是一种带有优先级的队列,它会根据元素的优先级顺序来进行排序;LinkedTransferQueue是一种基于链表实现的无界队列,它支持高效的并发访问,并且它提供了一种阻塞等待的机制;

ConcurrentLinkedQueue是一种基于链接节点的无界线程安全队列,支持高性能的并发操作。

在这里插入图片描述

结语

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/376645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity Lighting -- Unity的光源简介

在主菜单栏中&#xff0c;点击Window -> Rendering -> Light Explorer打开光源管理器&#xff0c;这个标签页可以看到场景中所有的光源&#xff0c;包括每个光源的类型&#xff0c;形状&#xff0c;模式&#xff0c;颜色&#xff0c;强度&#xff0c;阴影等信息。 在主菜…

android unit test mock框架使用记录

写在前面 之前上班时&#xff0c;开发一个功能之后&#xff0c;还需要编写测试用例&#xff0c;使用的框架是mock。 为什么防止以后用到时忘了&#xff0c;在这里记录一下。 由于团队没有人使用Espresso进行unit test&#xff0c;所以本人对该框架并不熟悉。想了解该框架的使用…

WPF布局控件之DockPanel

DockPanel DockPanel&#xff0c;英文释义为停靠面板&#xff0c;那是怎么个停靠法呢&#xff1f;如下&#xff1a; <Window x:Class"LearnLayout.DockPanelWin"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http:/…

数字图像处理

文章目录图像复原上升阶跃边缘、下降阶跃边缘、脉冲状边缘和屋顶状边缘曲线及其一阶导数和二阶导数有哪些特征&#xff1f;Hough变换的基本思想是什么&#xff1f;基本概念图像增强灰度变换直方图&#xff1a;直方图特点matlab代码空间域滤波平滑空间滤波均值滤波器&#xff1a…

python如何实现多线程

今天本来打算学习学习多进程的&#xff0c;但是由于我现在的电脑没有Linux系统&#xff0c;无法通过Linux系统编辑一些多进程的程序&#xff0c;因此我打算从多线程入手。 多线程 我们的程序一般都是多任务的&#xff0c;如果你没有好好的利用好&#xff0c;运行时就会出现卡…

【读论文】TCL: an ANN-to-SNN Conversion with Trainable Clipping Layers

DAC 2021 背景 通过ANN2SNN的方法得到的SNN中&#xff0c;存在准确性和延迟之间的一种权衡关系&#xff0c;在较大的数据集&#xff08;如ImageNet&#xff09;上可能会有较高的延迟。 主要贡献 分析了转换后SNN精度与延迟之间存在权衡关系的原因&#xff0c;并指出了如何缓…

6587: 计算分段函数

描述本题目要求计算下列分段函数f(x)的值&#xff1a;输入输入在一行中给出实数x。输出在一行中按“f(x) result”的格式输出&#xff0c;其中x与result都保留两位小数。样例输入10样例输出f(10.00) 3.16提示C/C可在头文件中包含math.h&#xff0c;并调用sqrt函数求平方根&am…

JAVA入门教程||Java Scanner 类||Java 异常处理

Java Scanner 类 java.util.Scanner是Java5的新特征&#xff0c;我们可以通过 Scanner 类来获取用户的输入。 下面是创建 Scanner 对象的基本语法&#xff1a; Scanner s new Scanner(System.in); 接下来我们演示一个最简单的的数据输入&#xff0c;并通过 Scanner 类的 nex…

产品分析丨豆瓣APP

本文将从以下几个方面进行分析&#xff1a;1. 产品功能结构2. 竞品分析3. 用户分析4. 用户调研5. 功能分析与优化方案6. 总结01 产品功能结构产品架构由豆瓣的产品架构图可看出&#xff0c;豆瓣是兼具书影音的评分系统和兴趣社区&#xff0c;以广告、知识付费和电商业务作为商业…

图解LeetCode——剑指 Offer 52. 两个链表的第一个公共节点

一、题目 输入两个链表&#xff0c;找出它们的第一个公共节点。 二、示例 如下面的两个链表&#xff1a; 在节点 c1 开始相交。 注意&#xff1a; 如果两个链表没有交点&#xff0c;返回 null.在返回结果后&#xff0c;两个链表仍须保持原有的结构。可假定整个链表结构中没…

代码质量与安全 | ChatGPT能帮到你什么还有待探索,但人工智能真的可以帮你做自动化测试

当听到“人工智能”&#xff08;AI&#xff09;时&#xff0c;你会想到什么&#xff1f; 你可能会开始想象科幻电影中的先进的人形机器人或者未来科技&#xff0c;但是&#xff0c;人工智能聊天机器人程序Chat GPT的爆火已经证明&#xff0c;这种“未来主义”技术已经融入了我…

三个月自学自动化测试,薪资15K直接翻倍,鬼知道我经历了什么····

学习软件测试是迫不得已&#xff0c;幸好最后通过自己的付出&#xff0c;得到了满意的回报。希望大家能通过我的经历得到一些帮助和思路。 零基础自学遇到的第一个难题就是需要怎么学&#xff0c;刚开始一头雾水&#xff0c;只能先从网上买些书来看&#xff0c;但是收效甚微。…

Unity中获取地形的法线

序之前&#xff0c;生成了地形图&#xff1a;(42条消息) 从灰度图到地形图_averagePerson的博客-CSDN博客那末&#xff0c;地形的法线贴图怎么获取&#xff1f;大概分为两个部分吧&#xff0c;先拿到法线数据&#xff0c;再画到纹理中去。关于法线计算Unity - Scripting API: M…

第4讲 cameraserver.rc详解(下)

本讲是Android Camera Native Framework专题的第4讲&#xff0c;我们介绍cameraserver.rc详解&#xff08;下&#xff09;&#xff0c;包括如下内容&#xff1a;Android init语言简介cameraserver.rc详解serviceuser选项group选项ioprio选项task_profiles选项rlimit选项更多&am…

领域自适应 DA Domain Adaptation

领域自适应是与机器学习和转移学习相关的领域。 当我们的目标是从源数据分布中学习在不同&#xff08;但相关&#xff09;的目标数据分布上的良好性能模型时&#xff0c;就会出现这种情况。 例如&#xff0c;常见垃圾邮件过滤问题的任务之一在于使模型从一个用户&#xff08;源…

2023年金三银四必备软件测试常见面试题1500问!!!【测试思维篇】

五、测试思维5.1 打电话功能怎么去测&#xff1f;我们会从几个方面去测试&#xff1a;界面、功能、兼容性、易用性、安全、性能、异常。1&#xff09;界面我们会测试下是否跟界面原型图一致&#xff0c;考虑浏览器不同显示比例&#xff0c;屏幕分辨率。2&#xff09;功能&#…

SpringBoot:SpringBoot配置文件application.properties、application.yml 和 application.ymal(2)

SpringBoot配置文件1. 配置文件格式1.1 application.properties配置文件1.2 application.yml配置文件1.3 application.yaml配置文件1.4 三种配置文件优先级和区别2. yaml格式2.1 语法规则2.2 yaml书写2.2.1 字面量&#xff1a;单个的、不可拆分的值2.2.2 数组&#xff1a;一组按…

《分布式技术原理与算法解析》学习笔记Day24

分布式缓存 在计算机领域&#xff0c;缓存是一个非常重要的、用来提升性能的技术。 什么是分布式缓存&#xff1f; 缓存技术是指用一个更快的存储设备存储一些经常用到的数据&#xff0c;供用户快速访问。 分布式缓存是指在分布式环境或者系统下&#xff0c;把一些热门数据…

全面零信任?Dell搞了个“大动作”

1860年&#xff0c;清朝僧格林沁带领数万骑兵&#xff0c;朝着数千英法联军发起猛烈冲锋&#xff0c;企图依靠清朝凶狠的骑兵突击战术击溃对方。然而&#xff0c;面对已经完成了近代化的西方军队&#xff0c;原来无往不利的八旗骑兵被打的土崩瓦解&#xff0c;再无任何抵抗的能…

Editor工具开发基础四:窗口EditorWindow

目录 1.设置窗口位置和大小 2.设置窗口最大和最小 3.设置窗口标题 4.设置窗中窗 BeginWindows和EndWindows 5.添加窗中窗可拖动 GUI.DragWindow() 完整代码&#xff1a; public class EditorToolWindow : EditorWindow {public static EditorToolWindow ins;[MenuItem(&q…