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

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. 微信小程序canvas实现圆形计时器功能

    index.js import Canvas from '../../utils/canvas.js'Page({ ...Canvas.options, /** * 页面的初始数据 */ data: ...

  2. 【树链剖分 差分】bzoj3626: [LNOI2014]LCA

    把LCA深度转化的那一步还是挺妙的.之后就是差分加大力数据结构了. Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep ...

  3. Shell:命令用户、用户组管理useradd、usermod

    文件及内容处理 - useradd.usermod 1. useradd:添加用户 useradd命令的功能说明 useradd 命令用于建立用户帐号.useradd 可用来建立用户帐号.帐号建好之后 ...

  4. python--初识html前端

    一.HTML文档结构 最基本的HTML文档: <!DOCTYPE html> <html lang="zh-CN"> #这个lang表示语言,zh-CN是中 ...

  5. ERROR! The server quit without updating PID file (/usr/local/var/mysql/bogon.pid).

    本文转载自http://www.jb51.net/article/48625.htm 今天网站web页面提交内容到数据库,发现出错了,一直提交不了,数找了下原因,发现数据写不进去!第一反应,重启mys ...

  6. Solr通过配DIH对数据库数据做索引

    1 加入相关jar包 将2个相关jar包复制到/opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF/lib文件夹下 jar包名称 solr-dataimp ...

  7. 经典DP问题--poj1088滑雪

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  8. bash快捷键及输入输出重定向

    bash特性之快捷键:     Ctrl+a: 跳转至命令首部     Ctrl+e: 跳转至命令尾部         Ctrl+l: 清屏     Ctrl+c: 中止或取消         Ctr ...

  9. Git常用的基本操作

    一.如何学习git指令 1.查看帮助:git help2.查看指定命令:git help clone3.搜索关键字:/chone 4.退出帮助文档:输入Q 二.常见命令 1.初始化git本地仓库:先进 ...

  10. 【Linux】网卡配置与绑定

    Redhat Linux的网络配置,基本上是通过修改几个配置文件来实现的. 虽然也可以用ifconfig来设置IP,用route来配置默认网关,用hostname来配置主机名,但是重启后会丢失. 相关 ...