`

Queue队列家族介绍

阅读更多
微信公众号文章列表:关注公众号(coding_song)阅读更清晰,附件为微信二维码  

Queue

队列接口,是一个为在处理前保存元素而设计的集合

Queue接口方法

add(E e):向集合中添加一个元素,如果是容量受限的队列(有界队列),当队列已满后,继续向队列中添加元素,将会抛异常,添加成功后,返回true
offer(E e):向集合中添加一个元素,如果是容量受限的队列(有界队列),当队列已满后,继续向队列中添加元素,将会返回false,否则返回true
remove():获取并删除队列中的头元素,当队列为空时,调用此方法,将会抛出异常,删除成功后,返回被删除的元素对象
poll():获取并删除队列中的头元素,当队列为空时,返回null,否则返回被删除的元素对象
element():获取队列中的头元素,当队列为空时,将抛出异常,否则返回队列的头元素
peek():获取队列中的头元素,当队列为空时,返回null,否则返回队列的头元素

BlockingQueue

阻塞队列接口,继承Queue接口,阻塞队列中的方法有4中形式,1)直接抛出一个异常;2)返回一个特定的值null或false等;3)无限期阻塞当前线程直到满足条件才继续后续操作;4)在给定的最大时间限制内阻塞;阻塞队列中的所有实现都是线程安全的,如果队列中没有元素,当获取队列中的元素时,将会一直阻塞,直到队列中有值后,才会返回元素内容;当向队列中添加元素时,如果队列已满,将会一直阻塞,直到队列中有空间时,才会将元素添加到队列中;

BlockingQueue接口方法

put(E e):向队列中添加元素,当队列已满时,将会一直阻塞,直到队列有空间时,才会成功将数据添加到队列中
offer(E e,long timeout,TimeUnit unit):将指定的元素插入到队列中,如有必要,等待指定的等待时间以使空间可用,在timeout时间后,如果队列中还是没有空间可用,将会抛出异常
take():获取并移除头元素,当队列中没有元素时,将会一直阻塞,直到有元素时,将会移除队列的头元素
poll(long timeout,TimeUnit unit):检索并删除此队列的头元素,如果需要,可等待指定的等待时间以使元素可用
drainTo(Collection<?superE> c):移除队列中的所有元素,并将这些元素添加到给定的集合中

Queue实现类

无界队列:PriorityBlockingQueue、ConcurrentLinkedQueue
有界队列:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue
阻塞队列:ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue
阻塞队列实现类PriorityBlockingQueue、ArrayBlockingQueue、LinkedBlockingQueue等都是线程安全的,内部调用ReentrantLock的lock或lockInterruptibly方法进行加锁,等待逻辑执行完成后,使用调用unlock释放锁
PriorityBlockingQueue:是一个使用与类PriorityQueue相同的排序规则并提供阻塞检索操作的无边界阻塞优先级队列,优先级队列不允许使用null元素,依赖自然排序的优先级队列不允许插入不能比较的对象
ConcurrentLinkedQueue:是一个基于链表节点的、线程安全的无界队列,遵循先进先出规则,队列中的头元素是队列中时间最长的元素,尾元素是队列中时间最短的元素;添加元素时,从队列尾添加元素,读取元素时,从队列的头读取元素;当多个线程需要共享一个集合时,可以使用ConcurrentLinkedQueue来保存集合,此集合不允许使用null元素
ArrayBlockingQueue:是一个由数组组成的有界阻塞队列,此队列遵循先进先出的原则,队列中的头元素是队列中时间最长的元素,尾元素是队列中时间最短的元素;添加元素时,从队列尾添加元素,读取元素时,从队列的头读取元素;这是一个景点的有界缓冲队列,是一个有生产者添加数据、消费者读取数据的固定大小的数组;一旦创建好ArrayBlockingQueue,其容量大小不可改变
LinkedBlockingQueue:是一个基于链接节点的、大小可选的有界阻塞队列,此队列遵循先进先出原则,队列中的头元素是队列中时间最长的元素,尾元素是队列中时间最短的元素;添加元素时,从队列尾添加元素,读取元素时,从队列的头读取元素;此队列比ArrayBlockingQueue具有更高的吞吐量,但其性能不好预测
SynchronousQueue:阻塞队列,其中每个put/offer操作必须等待另一个线程执行相应的take/poll操作,反之亦然;其内部没有数据缓存空间,不用来保存数据;数据是在配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲数据到队列中,使用示例如下
  1. publicstaticvoid main(String[] args)throwsInterruptedException{
  2.    SynchronousQueue queue =newSynchronousQueue();
  3.    Runnable offer =()->{
  4.        try{
  5.            queue.offer(1,1000,TimeUnit.MILLISECONDS);
  6.        }catch(InterruptedException e){
  7.            e.printStackTrace();
  8.        }
  9.    };
  10.    Runnable poll =()->System.out.println("test SynchronousQueue:" + queue.poll());
  11.    newThread(offer).start();
  12.    Thread.sleep(1000);
  13.    newThread(poll).start();
  14. }
创建offer生产者线程和poll消费者线程,然后启动两个线程,最终生产者线程将数据传递给消费者线程,打印结果为:testSynchronousQueue:1 推荐阅读:回首过往、展望未来 扫码关注获取更多文章
0
0
分享到:
评论
相关资源推荐
  • Java必知必会---队列BlockingQueue家族 Java必知必会---队列BlockingQueue家族 IT小鳄鱼 2017-12-04 19:21:35 Java必知必会---队列BlockingQueue家族   队列是我们在开发中经常会使用到的一种数据结构,并且在多线程资源共享与数据协调的场景中,队列也是我们最喜欢的选择之一,尤其是在生产者与消费者模型中。下面我们就介绍一下在java中常用的BlockingQueue
  • 编程语言家族族谱(看看你知道的有多少) 在这个列表中只有50左右的语言,如果你找不到你所想要的语言,那么请看Bill Kinnersley 的列表,他的列表里可有2500种编程语言呢。呵呵:http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm 访问 计算机语言历史 网站
  • C++ stl队列Queue用法介绍   c++队列queue模板类的定义在&amp;lt;queue&amp;gt;头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。    C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。C++队列Queue类成员函数如下:back() 返回最后一个元素empty() 如果队列空则返回真fro...
  • Queue队列详解 本文主要介绍queue的内部实现原理,并给出了应用例子
  • 安卓Queue的使用 Queue的成员函数        add        增加一个元索                     如果队列已满,则抛出一个IIIegaISlabEepeplian异常       remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常       element  返回队列头部的元素          
  • 队列queue的使用方法 #include #include using namespace std; int main() { int e,n,m; queue q1; for(int i=0;i { //入列,插入队列的末端。 q1.push(i); } //判断队列是否为空,当队列为空时,q1.empty(),返回true. if(!q1.empty()) cout //
  • STL - queue队列 Queue简介 queue队列容器,是一种“先进先出”的容器。 queue是简单地装饰deque容器而成为另外的一种容器。 #include queue对象的默认构造 queue采用模板类实现,queue对象的默认构造形式:queue queT; 如: queue queInt; //一个存放int的queue容器。 queue queFloat; /
  • Linux 块设备层中的Multi-queue分析 目前,百万甚至千万级别的IOPS数据访问量已成为一个大趋势,并且当前的SSD展现着越来越高效的性能表现。在这种趋势下linux的块设备层渐渐成为了整体系统性能提升的主要瓶颈。本文主要讨论的是在多核系统下,如何利用Multi-queue减小块设备层对整体性能的影响。 传统的块设备层针对于千/万级别的IOPS数据访问量是有所余力的,但是面对与日俱增的大数据访问,特别是在底层SSD提供更高速的访问性能...
  • QOS-3 Queue 队列机制 session 1 QOS Queue Queue队列技术。在出接口使用丢弃机制,主要解决数据包的延迟和抖动问题。 早期的队列技术有: 1、FIFO        目前出接口默认的用于高速以太网接口的队列机制,先进先出first in first out 2、PQ          多队列轮询,使用ACL将流量分为4个队列,出接口传输的时候根据队列编号1-4,
  • C++ stl队列Queue用法介绍:删除,插入等操作代码举例 C++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。 C++队列Queue是一种容器适配器,它...   C++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类
  • 多线程无锁(lock-free)队列(queue)的实现探讨 前面我实现了一个无锁堆,下面打算实现无锁的 FIFO 队列
  • 关于今天学习unity Queue总结 当初学过,但是早就忘记了,今天因为一个需求,经过同事提醒,想起了他。先做记录和总结,后期补充。Queue  队列  先进先出。今天的需求:语音识别,c++那边会给我传(他会在线程里,而我用unity会在主线程里) 语音识别到的字符串,如果没有新的语句,会再给我传一个字符串后面再加一个句号。这就意味着,我要在Update中调用 他的方法,并且接收到他的数据  两次!!!!!正常情况下 接收就就收了,...
  • Queue接口 Queue用于模拟队列这种数据结构,队列通常是指“先进先出”的容器。队列的头部保存在队列中时间最长的元素,队列的 尾部 保存在队列中时间最短的元素。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素。通常,队列不允许 随机访问队列中的元素。 Queue接口中定义了如下操作方法: == void add(Object e):将指定元素加入此队列的尾部。 == Object eleme
  • 深入Celery之使用队列以及优先级提高响应 多个队列: 1. Celery默认使用的队列名为celery默认绑定在direct交换机celery,可通过CELERY_DEFAULT_QUEUE/CELERY_DEFAULT_EXCHANGE/CELERY_DEFAULT_ROUTING_KEY等参数配置修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1
  • Adobe 家族的软件介绍
  • glib库队列GQueue介绍 队列是一种向最后添加条目,从最前删除条目的数据结构,这种数据结构在处理按顺序到达的数据是很有用。glib库提供的队列GQueue是一个双端队列,它的实现基础是双向链表,所以它支持在队列的两端进行添加和删除,也支持很多其它的操作,比如在队列中进行插入和删除,但是我不推荐使用这样的功能,因为当你经常需要在队列中进行插入和删除的时候,链表或许是个更好的选择。下面的代码演示利用glib库中的GQueue
  • STL之queue实现详解 队列 承接上节栈的讲解,因为实现的list和dqueue这种双进双出的底层容器,那么对于queue这种适配器,实现起来就非常简单了。queue具有先进先出的数据结构。仅仅支持新增元素、移除元素、从最底端加入元素、取最顶端元素。这些方法而已。只要细心分析了deque,这个适配器就很容易了。 STL-queue 实现起来非常简单,那么直接给出源代码,解释其中比较重要的地方。 队列不提供迭代...
  • java 自定义Queue队列 java 自定义Queue队列 java 自定义Queue队列
  • 队列Queue的C++实现 队列queue的c++实现,包括了队列的出对,入队,获取队头元素,清空队列,判断队列空满等常规操作。对初学者很有帮助哈
  • TC 队列规定家族:根、句柄、兄弟和父辈 TC parenthandle参数的用法 tc class上的parent :参数是队列ID。classid是自己的ID。 tc qdisc parent 参数是类的ID。 见下例: tc qdisc add dev eth0 root handle 9: htb default 11 #root id 9 tc class add dev eth0 pare
Global site tag (gtag.js) - Google Analytics