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使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot集成MinIO对象存储服务器操作步骤

    Spring Boot集成MinIO对象存储服务器操作步骤

    通过Spring Boot集成MinIO,你可以在应用中方便地进行文件的存储和管理,本文给大家分享Spring Boot集成MinIO对象存储服务器详细操作步骤,感兴趣的朋友一起看看吧
    2024-01-01
  • springboot自定义starter启动器的具体使用实践

    springboot自定义starter启动器的具体使用实践

    本文主要介绍了springboot自定义starter启动器的具体使用实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 指定springboot的jar运行内存方式

    指定springboot的jar运行内存方式

    这篇文章主要介绍了指定springboot的jar运行内存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java实现世界上最快的排序算法Timsort的示例代码

    Java实现世界上最快的排序算法Timsort的示例代码

    Timsort 是一个混合、稳定的排序算法,简单来说就是归并排序和二分插入排序算法的混合体,号称世界上最好的排序算法。本文将详解Timsort算法是定义与实现,需要的可以参考一下
    2022-07-07
  • ArrayList与linkedList的用法区别及扩容方式

    ArrayList与linkedList的用法区别及扩容方式

    这篇文章主要介绍了ArrayList与linkedList的用法区别及扩容方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Maven dependency中的scope案例讲解

    Maven dependency中的scope案例讲解

    Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile,本文给大家介绍Maven dependency中的scope案例讲解,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • Java详解表格的创建与使用流程

    Java详解表格的创建与使用流程

    这篇文章主要介绍了怎么用Java来创建和使用表格,表格是我们经常要用的工具,但是你有想过自己怎么去实现它吗,感兴趣的朋友跟随文章往下看看吧
    2022-04-04
  • Java里volatile关键字是什么意思

    Java里volatile关键字是什么意思

    volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”,也就是说不保证线程执行的有序性。这篇文章主要介绍了Java里volatile关键字是什么意思的相关资料,需要的朋友可以参考下
    2016-11-11
  • SpringBoot使用@valid进行参数校验的流程步骤

    SpringBoot使用@valid进行参数校验的流程步骤

    SpringBoot 提供了一种方便的方式来进行参数校验:使用 Hibernate Validator,Spring Boot 提供了一种方便的方式来进行参数校验:使用 Hibernate Validator,所以本文给大家介绍了SpringBoot使用@valid进行参数校验的流程步骤,需要的朋友可以参考下
    2023-09-09
  • Java实现JDBC向数据库批量插入

    Java实现JDBC向数据库批量插入

    在Java项目中可能会出现大量向数据库中插入的情况,本文主要介绍了Java实现JDBC向数据库批量插入,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09

最新评论