---恢复内容开始---

Queue:基本上一个队列就是一个先入先出(FIFO)的数据结构

Queue接口与List、Set同一级别,都是继承了Collection接口,LinkedList实现了List与Deque接口。

Queue实现

1、没有实现阻塞接口的LinkedList:实现了java.util.Queue接口和java.util.AbstractQueue接口

  内置的不阻塞队列:PriorityQueue和ConcurrentLinkedQueue

  PriorityQueue和ConcurrentLinkedQueue类在Collection FrameWork中加入两个具体集合实现。

  PriorityQueue类实质上维护了一个有序列表。加入到Queue中的元素根据他们天然排序(通过其java.util.Comparable实现)或者根据传递给构造函数的java.util.Comparator来实现定位。

  ConcurrentLinkedQueue是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大小,ConcurrentLinkedQueue对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。(通过CAS保证并发)

2、实现阻塞接口的:

  java.util.concurrent中加入了BlockingQueue接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的FIFO数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,知道有空间或者元素可用。

  五个队列所提供的各有不同:

    *ArrayBlockingQueue:一个由数组支持的有界队列。

    *LinkedBlockingQueue:一个由链接节点支持的可选有界队列。

    *PriorityBlockingQueue:一个由优先级堆支持的无界优先队列。

    *DelayQueue:一个由优先级堆支持的、基于时间的调度队列。

    *SynchronousQueue:一个利用BlockingQueue接口的简单聚集(rendezvous)机制。

下表显示了jdk1.5中的阻塞队列的操作:

  add    添加一个元素        如果队列已满,抛出一个IllegalStateException(“Queue full”)异常

  remove   移除并返回队列头部的元素  如果队列为空,则抛出一个NoSuchElementException异常

  element  返回队列头部的元素     如果队列为空,则抛出一个NoSuchElementException异常

    offer     添加一个元素并返回true      如果队列已满,则返回false

  poll    移除并返回队列头部的元素  如果队列为空,则返回null

  peek     返回队列头部的元素       如果队列为空,则返回null

  put    添加一个元素         如果队列已满,则阻塞

  take    移除并返回队列头部的元素  如果队列为空,则阻塞  

remove、element、offer、poll、peek其实是属于Queue接口。

阻塞队列的操作可以根据它们的响应方式分为以下三类:add、remove和element,这些操作在你试图向一个已满的队列添加元素或空队列获取元素时抛出异常。当然,在多线程程序中,队列在任何时间都可能变成满的或空的,所以你可能想使用offer、poll、peek方法。这些方法在无法完成任务时,只是给出一个出错而不会抛出异常。

注意:poll和peek方法出错会返回null。因此向队列中插入null值是不合法的

阻塞队列put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。

LinkedBlockingQueue的容量是没有上限的(在不指定容量时,默认容量为Integer.MAX_VALUE),也可以指定最大容量,它是基于链表的队列,此队列按FIFO(先进先出)排序元素。(可以实现生产者消费者模式)

ArrayBlockingQueue在构造时需要指定容量,并可以选择是否需要公平性,如果公平参数被设置true,等待时间最长的线程会优先得到处理(其实是通过将ReentrantLock设置为true来达到这种公平性的:即等待时间最长的线程会先操作)。

PriorityBlockingQueue是一个带优先级的队列,而不是先进先出队列。元素按优先级顺序被移除,该队列也没有上限(PriorityBlockingQueue是对PriorityQueue的再次包装,是基于堆数据结构的,而PriorityQueue是没有容量限制的,与ArrayList一样,所以在优先阻塞队列上put时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致OutOfMemoryError),但是如果队列为空,那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的。另外,进入该队列的元素要具有比较能力(实现Comparable接口,重写conpareTo方法)。

DelayQueue(基于PriorityQueue实现的)是一个存放Delayed元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed元素。如果延迟期都还没有满,则队列没有头部,并且poll将返回null。当一个元素的getDelay(TimeUnit.NANOSECONDS)方法返回一个小于或等于零的值时,则出现期满,poll就可以移除这个元素了,此队列不允许使用null元素。

java队列--queue详细分析的更多相关文章

  1. java队列——queue详细分析

    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口.   Q ...

  2. java队列Queue及阻塞队列

    java队列 接口Queue类在java.util包,定义了以下6个方法 详细查看官方文档https://docs.oracle.com/javase/7/docs/api/java/util/Que ...

  3. 学习笔记之Java队列Queue中offer/add函数,poll/remove函数,peek/element函数的区别

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. Java中Que ...

  4. Java队列Queue

    上个星期总结了一下synchronized相关的知识,这次将Queue相关的知识总结一下,和朋友们分享. 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供 ...

  5. java队列queue的我觉得很好的使用方式

    LinkedList实现了queue接口,通常使用LinkedList 其中关键两个函数:offer().poll() offer()表示“排队”----插入到队列最前,poll()表示轮到了队列最前 ...

  6. Java ClassLoader 原理详细分析(转)

    转载自:http://www.codeceo.com/article/java-classloader.html 一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管 ...

  7. Java ClassLoader 原理详细分析

    一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程 ...

  8. java.util.BitSet 详细分析 学习笔记

    1,BitSet类    大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志.   此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的 ...

  9. Java equal() 和 == 详细分析

    1 ==  返回值是true/false; (1) 基本数据类型比较的就是值(2)引用型数据类型就是地址值 public class Test1 { public static void main(S ...

随机推荐

  1. ios xmpp demo

    为了方便程序调用,我们把XMPP的一些主要方法写在AppDelegate中 在AppDelegate.m下这几个方法为: [java] view plaincopy -(void)setupStrea ...

  2. 异步FIFO最小深度计算

    计算FIFO深度是设计FIFO中常遇到的问题.常识告诉我们,当读速率慢于写速率时,FIFO便可被用作系统中的缓冲元件或队列.因此FIFO的大小基本上暗示了所需缓存数据的容量,该容量取决于读写数据的速率 ...

  3. verilog random使用

    “$random函数调用时返回一个32位的随机数,它是一个带符号的整形数...”,并给出了一个例子: _________________________________________________ ...

  4. Web框架之Django_06 模型层了解(F查询、Q查询、事务、update和save、only和defer、choice属性、bulk_create)

    摘要: F查询 Q查询 事务 一.F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢?Django 提供 F() 来 ...

  5. python爬虫入门三:requests库

    urllib库在很多时候都比较繁琐,比如处理Cookies.因此,我们选择学习另一个更为简单易用的HTTP库:Requests. requests官方文档 1. 什么是Requests Request ...

  6. 组队赛Day1第一场 GYM 101350 G - Snake Rana (容斥)

    [题意] 给一个N×M的矩阵, K个地雷的坐标.求不含地雷的所有矩形的总数. T组数据. N M都是1e4,地雷数 K ≤ 20 Input 3 2 2 1 2 2 6 6 2 5 2 2 5 100 ...

  7. leetcode刷题——双指针

    知识点 专题-B-双指针 题目: 题解: CS-Notes Algorithm_Interview_Notes-Chinese awesome-algorithm zcy19941015的博客

  8. 00031_ArrayList集合中常用的方法

    1.ArrayList集合提供的一些常用方法 import java.util.ArrayList; public class ArrayListDemo01 { public static void ...

  9. Python内置函数7

    Python内置函数7 1.propertypython内置的一个装饰器可参考https://blog.csdn.net/u013205877/article/details/77804137 2.q ...

  10. TOJ 4475: The Coolest Sub-matrix

    4475: The Coolest Sub-matrix  Time Limit(Common/Java):4000MS/12000MS     Memory Limit:65536KByteTota ...