Java中的ConcurrentLinkedQueue使用解析

 更新时间:2023年12月28日 09:30:30   作者:小宇宙121  
这篇文章主要介绍了Java中的ConcurrentLinkedQueue使用解析,一个基于链接节点的无界线程安全队列,此队列按照 FIFO(先进先出)原则对元素进行排序,队列的头部是队列中时间最长的元素,需要的朋友可以参考下

定义

一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。

队列的头部是队列中时间最长的元素。

队列的尾部是队列中时间最短的元素。 新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。

当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。

此队列不允许使用 null 元素。

函数

  • offer(E e) 将指定元素插入此队列的尾部。
  • poll() 获取并移除此队列的头,如果此队列为空,则返回 null
  • add() 与offer(E e)完全一样,都是往队列尾部添加元素
  • peek() 获取但不移除此队列的头;如果此队列为空,则返回 null
  • remove(Object o) 从队列中移除指定元素的单个实例(如果存在)
  • contains(Object o) 如果此队列包含指定元素,则返回 true
  • toArray() 返回以恰当顺序包含此队列所有元素的数组
  • toArray(T[] a) 返回以恰当顺序包含此队列所有元素的数组;返回数组的运行时类型是指定数组的运行时类型
  • size() 返回此队列中的元素数量
  • isEmpty 返回队列是否为空

注意:当需要判断队列是否有值时,推荐使用isEmpty(),size()的时间复杂度是o(n),当数据量很大时,会比isEmpty()消耗明显多的时间。

下面比较一下isEmpty()和size()耗时:

public class ConcurrentLinkedQueueTest {
    private static final Logger logger = LoggerFactory.getLogger(ConcurrentLinkedQueueTest.class);
    public static void main(String args[]) throws InterruptedException {
        ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
        int serviceNum = 10;//服务窗口数
        int perpeoNum = 10000;//买车票人数
        CountDownLatch countDownLatch = new CountDownLatch(serviceNum);//初始值是线程的个数
        //将买票人数放入队列
        for(int i=0; i<perpeoNum; i++){
            queue.add("买票人_" + i);
        }
        //执行10个线程从队列取出买票人
        logger.info("-----开始卖票了--------");
        long start = System.currentTimeMillis();
        ExecutorService service = Executors.newFixedThreadPool(10);
        for(int i=0; i<serviceNum; i++){
            service.submit(new Windows("窗口号_" + i , queue, countDownLatch));
        }
        //等待所有线程都执行完,主线程再执行。
        countDownLatch.await();
		logger.info("-----所有人都买完票了----");
        long time = System.currentTimeMillis() - start;
        logger.info("总消耗时间是:{}",time);
        service.shutdown();
    }
    private static class Windows implements Runnable{
        private String name;
        private ConcurrentLinkedQueue queue;
        private CountDownLatch countDownLatch;
        public Windows(String name, ConcurrentLinkedQueue queue, CountDownLatch countDownLatch){
            this.name = name;
            this.queue = queue;
            this.countDownLatch = countDownLatch;
        }
        @Override
        public void run() {
        //   while (!queue.isEmpty()){
            while(queue.size() > 0){  
                logger.info(queue.poll()  + "---买票完毕---{}", name );
            }
            countDownLatch.countDown();//线程执行完,count值-1
        }
    }
}

执行结果: 使用size(),耗时511ms; 使用isEmpty(),耗时125ms; 所以优先使用isEmpty();

CountDownLatch

CountDownLatch是一个非常实用的多线程控制工具类,例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。

每当一个线程完成了自己的任务后,计数器的值就会减1。

当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

到此这篇关于Java中的ConcurrentLinkedQueue使用解析的文章就介绍到这了,更多相关ConcurrentLinkedQueue使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java自定义类加载器如何实现类隔离

    java自定义类加载器如何实现类隔离

    这篇文章主要介绍了java自定义类加载器如何实现类隔离问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Mybatis基于xml配置实现单表的增删改查功能

    Mybatis基于xml配置实现单表的增删改查功能

    这篇文章主要介绍了Mybatis基于xml配置实现单表的增删改查,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 学习Java的9张思维导图

    学习Java的9张思维导图

    这篇文章主要为大家详细介绍了学习Java的9张思维导图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java 超详细讲解数据结构中的堆的应用

    Java 超详细讲解数据结构中的堆的应用

    堆首先是一个完全二叉树,堆分为小根堆和大根堆。小根堆,所有结点的左右子节点都不小于根节点;大根堆,所有结点的左右子节点都不大于根节点。优先级队列(priorityQueue)底层就是一个小根堆
    2022-04-04
  • Java实现权重随机获取值或对象的方法

    Java实现权重随机获取值或对象的方法

    这篇文章主要介绍了Java实现权重随机获取值或对象的方法,treeMap是一种基于红黑树实现的有序映射表,提供了一系列的方法来操作映射表中的元素,其中tailMap方法是用于返回映射表中大于或等于给定键的部分视图,需要的朋友可以参考下
    2023-11-11
  • bool当成函数参数错误理解

    bool当成函数参数错误理解

    经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性
    2012-11-11
  • SpringBoot应用中多RabbitMQ连接问题的解决方法

    SpringBoot应用中多RabbitMQ连接问题的解决方法

    在企业级开发中,我们经常遇到这样的场景:系统已经使用了自己的 RabbitMQ 处理核心业务,但又需要对接第三方系统的 RabbitMQ,由于 Spring Boot 默认只支持单个 RabbitMQ 连接配置,直接添加第二个连接会导致配置冲突,本文将详细介绍如何优雅地解决这个问题
    2025-11-11
  • Java反射之通过反射获取一个对象的方法信息(实例代码)

    Java反射之通过反射获取一个对象的方法信息(实例代码)

    下面小编就为大家带来一篇Java反射之通过反射获取一个对象的方法信息(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 使用maven实现版本覆盖的案例分享

    使用maven实现版本覆盖的案例分享

    这篇文章主要介绍了使用maven实现版本覆盖的案例分享,文中通过图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-10-10
  • @RefreshScope在Quartz 触发器类导致异常问题解决分析

    @RefreshScope在Quartz 触发器类导致异常问题解决分析

    这篇文章主要为大家介绍了@RefreshScope在Quartz 触发器类导致异常问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论