定义

一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。
新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。

offer和poll

offer(E e) 
          将指定元素插入此队列的尾部。

poll() 
          获取并移除此队列的头,如果此队列为空,则返回 null。

public static void main(String[] args) {ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue();queue.offer("哈哈哈");System.out.println("offer后,队列是否空?" + queue.isEmpty());System.out.println("从队列中poll:" + queue.poll());System.out.println("pool后,队列是否空?" + queue.isEmpty());}

offer是往队列添加元素,poll是从队列取出元素并且删除该元素

执行结果

offer后,队列是否空?false
从队列中poll:哈哈哈
pool后,队列是否空?true

ConcurrentLinkedQueue中的add() 和 offer() 完全一样,都是往队列尾部添加元素

还有个取元素方法peek

peek() 
          获取但不移除此队列的头;如果此队列为空,则返回 null

public static void main(String[] args) {ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue();queue.offer("哈哈哈");System.out.println("offer后,队列是否空?" + queue.isEmpty());System.out.println("从队列中peek:" + queue.peek());System.out.println("从队列中peek:" + queue.peek());System.out.println("从队列中peek:" + queue.peek());System.out.println("pool后,队列是否空?" + queue.isEmpty());}

执行结果:

offer后,队列是否空?false
从队列中peek:哈哈哈
从队列中peek:哈哈哈
从队列中peek:哈哈哈
pool后,队列是否空?false

remove

remove(Object o) 
          从队列中移除指定元素的单个实例(如果存在)

public static void main(String[] args) {ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue();queue.offer("哈哈哈");System.out.println("offer后,队列是否空?" + queue.isEmpty());System.out.println("从队列中remove已存在元素 :" + queue.remove("哈哈哈"));System.out.println("从队列中remove不存在元素:" + queue.remove("123"));System.out.println("remove后,队列是否空?" + queue.isEmpty());}

remove一个已存在元素,会返回true,remove不存在元素,返回false

执行结果:

offer后,队列是否空?false
从队列中remove已存在元素 :true
从队列中remove不存在元素:false
remove后,队列是否空?true

size or isEmpty

size() 
          返回此队列中的元素数量

注意:

如果此队列包含的元素数大于 Integer.MAX_VALUE,则返回 Integer.MAX_VALUE。
需要小心的是,与大多数 collection 不同,此方法不是 一个固定时间操作。由于这些队列的异步特性,确定当前的元素数需要进行一次花费 O(n) 时间的遍历。
所以在需要判断队列是否为空时,尽量不要用 queue.size()>0,而是用 !queue.isEmpty()

比较size()和isEmpty() 效率的示例:

场景:10000个人去饭店吃饭,10张桌子供饭,分别比较size() 和 isEmpty() 的耗时

public class Test01ConcurrentLinkedQueue {public static void main(String[] args) throws InterruptedException {int peopleNum = 10000;//吃饭人数int tableNum = 10;//饭桌数量ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();CountDownLatch count = new CountDownLatch(tableNum);//计数器//将吃饭人数放入队列(吃饭的人进行排队)for(int i=1;i<=peopleNum;i++){queue.offer("消费者_" + i);}//执行10个线程从队列取出元素(10个桌子开始供饭)System.out.println("-----------------------------------开饭了-----------------------------------");long start = System.currentTimeMillis();ExecutorService executorService = Executors.newFixedThreadPool(tableNum);for(int i=0;i<tableNum;i++) {executorService.submit(new Dinner("00" + (i+1), queue, count));}//计数器等待,知道队列为空(所有人吃完)count.await();long time = System.currentTimeMillis() - start;System.out.println("-----------------------------------所有人已经吃完-----------------------------------");System.out.println("共耗时:" + time);//停止线程池executorService.shutdown();}private static class Dinner implements Runnable{private String name;private ConcurrentLinkedQueue<String> queue;private CountDownLatch count;public Dinner(String name, ConcurrentLinkedQueue<String> queue, CountDownLatch count) {this.name = name;this.queue = queue;this.count = count;}@Overridepublic void run() {//while (queue.size() > 0){while (!queue.isEmpty()){//从队列取出一个元素 排队的人少一个System.out.println("【" +queue.poll() + "】----已吃完..., 饭桌编号:" + name);}count.countDown();//计数器-1}}
}

执行结果:

使用size耗时:757ms

使用isEmpty耗时:210

当数据量越大,这种耗时差距越明显。所以这种判断用isEmpty 更加合理

contains

contains(Object o) 
          如果此队列包含指定元素,则返回 true

public static void main(String[] args) throws InterruptedException {ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue();queue.offer("123");System.out.println(queue.contains("123"));System.out.println(queue.contains("234"));}

执行结果:

toArray

toArray() 
          返回以恰当顺序包含此队列所有元素的数组

toArray(T[] a) 
          返回以恰当顺序包含此队列所有元素的数组;返回数组的运行时类型是指定数组的运行时类型

public static void main(String[] args) throws InterruptedException {ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();queue.offer("123");queue.offer("234");Object[] objects = queue.toArray();System.out.println(objects[0] + ", " + objects[1]);//将数据存储到指定数组String[] strs = new String[2];queue.toArray(strs);System.out.println(strs[0] + ", " + strs[1]);}

执行结果:

iterator

iterator() 
          返回在此队列元素上以恰当顺序进行迭代的迭代器

public static void main(String[] args) throws InterruptedException {ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();queue.offer("123");queue.offer("234");Iterator<String> iterator = queue.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}

ConcurrentLinkedQueue文档说明:

构造方法摘要
ConcurrentLinkedQueue() 
          创建一个最初为空的 ConcurrentLinkedQueue。
ConcurrentLinkedQueue(Collection<? extends E> c) 
          创建一个最初包含给定 collection 元素的 ConcurrentLinkedQueue,按照此 collection 迭代器的遍历顺序来添加元素。
方法摘要
 boolean add(E e) 
          将指定元素插入此队列的尾部。
 boolean contains(Object o) 
          如果此队列包含指定元素,则返回 true。
 boolean isEmpty() 
          如果此队列不包含任何元素,则返回 true。
 Iterator<E> iterator() 
          返回在此队列元素上以恰当顺序进行迭代的迭代器。
 boolean offer(E e) 
          将指定元素插入此队列的尾部。
 E peek() 
          获取但不移除此队列的头;如果此队列为空,则返回 null。
 E poll() 
          获取并移除此队列的头,如果此队列为空,则返回 null。
 boolean remove(Object o) 
          从队列中移除指定元素的单个实例(如果存在)。
 int size() 
          返回此队列中的元素数量。
 Object[] toArray() 
          返回以恰当顺序包含此队列所有元素的数组。
<T> T[]
toArray(T[] a) 
          返回以恰当顺序包含此队列所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

逃避不一定躲得过,面对不一定最难过

ConcurrentLinkedQueue使用和方法介绍相关推荐

  1. webview 加载php页面内容,WebView加载优化的方法介绍

    本篇文章给大家带来的内容是关于WebView加载优化的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. WebView加载优化 当WebView的使用频率变得频繁的时候,对于其 ...

  2. LoadRunner设置检查点的几种方法介绍

    LoadRunner设置检查点的几种方法介绍 发布时间: 2011-5-03 11:53    作者: 一米阳光做测试    来源: 51Testing软件测试网采编 字体:  小  中  大  | ...

  3. python加号换行,Python字符串拼接六种方法介绍

    Python字符串拼接的6种方法: 1.加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接用"+"来连接两个字符串: prin ...

  4. 小程序 sha1和服务器有关系吗,微信小程序使用sha1实现密码加密的方法介绍

    微信小程序使用sha1实现密码加密的方法介绍,字符串,程序,转换为,详解,函数 微信小程序使用sha1实现密码加密的方法介绍 易采站长站,站长之家为您整理了微信小程序使用sha1实现密码加密的方法介绍 ...

  5. 360p4虚拟服务器,360安全路由p4c常见的问题以及解决方法介绍

    360安全路由p4c在使用的时候会遇到哪些问题呢?360安全路由p4c在使用的时候操作并不是很复杂,但是对于新手用户来说还是有点难度的,接下来的文章中小编将介绍使用这款路由器遇到的五大问题及其姐姐方法 ...

  6. 如何用计算机弹逆战6,逆战星光弹夹使用方法介绍 轻松玩转星光弹

    逆战星光弹夹使用方法介绍 轻松玩转星光弹,今天小编为大家带来的是逆战星光弹夹使用方法介绍,感兴趣的小伙伴快来看看吧. 目前,逆战共有星光弹匣三款.分别为:陷阱加速.空气墙.强固.三款不同的弹匣,用了三 ...

  7. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍 参考文章: (1)jquery的ajax()函数传值中文乱码解决方法介绍 (2)https://www.cnblogs.com/xuxiaosh ...

  8. html优化网站的方法,利用HTML优化加快网页速度方法介绍

    减少web页面下载时间的关键就是设法减小文件大小.当多个页面共用一些成分内容时,就可以考虑将这些公用部分单独分离出来.比如:我们可以将多个HTML页面都用到的脚本程序编写成独立存在的.js文件,然后再 ...

  9. [转]Linux下pppoe配合Drcom插件上网方法介绍......

    Linux下pppoe配合Drcom插件上网方法介绍 近几天在西邮bbs上闲逛,无意间注意到很多人纠结于同一个问题---linux上网,众所周知,linux系统在宿舍上网时比较烦人的一件事,虽然bbs ...

最新文章

  1. 【linux练习】基础作业一
  2. linux 不接显示器不启动_不知道这十项Linux常识,就别说自己玩过Linux
  3. spark 调度模块详解及源码分析
  4. 蓝桥杯2016省赛真题-剪邮票(dfs)
  5. Redis2.6安装报错
  6. ICP算法与Kdtree
  7. python爬取豆瓣书籍_python爬取豆瓣书籍排行
  8. STM32固件库的安装
  9. 语音识别中输入输出的可能形式有哪些
  10. 概率论与计算机的关系小论文,概率论与数理统计论文
  11. android 按键流程及映射
  12. 【图像去噪】基于butterworth滤波器、中值、维纳、小波算法实现图像去噪含GUI
  13. 文献阅读——梅州佛教香花的结构、文本与变体
  14. android媒体焦点音量压低/暂停逻辑源码简析
  15. C++ std::string::substr()
  16. 泰拉瑞亚指令代码大全 无限钱无敌作弊码一览
  17. Centos搭建服务
  18. 齐向东透露工信部检测360浏览器
  19. Poj 2965 The Pilots Brothers‘ refrigerator
  20. svn基于mysql认证_Svn基于mysql做登陆认证

热门文章

  1. Prism_Commanding(2)
  2. iVMS-4200 Vs区别_【欧国联:德国 VS 瑞士】体育足球赛事专业紅單推荐
  3. QT 基础知识一(QT安装、创建项目、常用窗口控件使用、信号与槽机制讲解)
  4. Unity性能优化方法总结
  5. 在线客服服务干货:如何与客户进行有效沟通?
  6. (原创)直观了解通道混和器的校色作用
  7. 解析torrent种子信息
  8. 整合营销系统推荐乐云seo_重庆整合营销【乐云seo】
  9. opencv+mnist识别手写数字串
  10. 【真相】ChatGPT和OpenAI的API KEY