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

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. shell脚本,对MySQL数据库进行分库加分表备份

    [root@localhost wyb]# cat table_backup.sh #!/bin/bash flag= user=root pass=test mysql -u$user -p&quo ...

  2. Bzoj 2752 高速公路 (期望,线段树)

    Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...

  3. Noip2018 考前准备

    目录 基础算法 二分 模拟(未补) 高精(未学习) 搜索(未补) 排序 图论 树的直径 树的重心 最短路算法 Spfa Dijkstra Floyd 最小生成树 kruskal 数论 线性筛 线性筛素 ...

  4. ClientAbortException:java.io.IOException解决方案

    org.apache.catalina.connector Class ClientAbortException java.lang.Object java.lang.Throwable java.l ...

  5. 【linux】【mysql】CentOS7安装mysql5.6.26

    http://www.cnblogs.com/dreamhome/p/4716425.html     linux系统CentOS7到http://mirrors.sohu.com/mysql/下载想 ...

  6. python基础知识13-迭代器与生成器,导入模块

    异常处理作业讲解 file = open('/home/pyvip/aaa.txt','w+') try: my_dict = {'name':'adb'} file.write(my_dict['a ...

  7. SpringMVC里静态网页不能加载到.js .css文件的问题

    在写SpringMVC项目时候,写的js css文件打不开,网上查了一下,解决办法: 在web.xml里面: <servlet> <servlet-name>dispatche ...

  8. linux时钟概念CST与UTC、以及NTP简单设置

    1.世界协调时间(Universal Time Coordinated,UTC): GPS 系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的时间,地方时为 ...

  9. LeetCode(7)Reverse Integer

    题目: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 分析: ...

  10. Lex与Yacc学习(一)之环境配置篇

    Abstract 在开发程序的过程中经常会遇到文本解析的问题,例如:解析 C 语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用 C 或者 C++直接编写解析程序,这 ...