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

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. pip install mysqlclient 报错:error: Microsoft Visual C++ 14.0 is required.

    解决办法: 1. 在网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/  下载对应的whl文件,如我的环境是python3.7.2  windows32位版本 ...

  2. Centos6.9 搭建rsync服务端与客户端 案例:全网备份项目

    rsync的企业工作场景说明 1)定时备份 1.1生产场景集群架构服务器备份方案项目 借助cron+rsync把所有客户服务器数据同步到备份服务器 2)实时复制 本地数据传输模式(local-only ...

  3. getComputedStyle与currentStyle获取元素当前的css样式

    CSS的样式分为三类: 内嵌样式:是写在标签里面的,内嵌样式只对所在的标签有效内部样式:是写在HTML里面的,内部样式只对所在的网页有效外部样式表:如果很多网页需要用到同样的样式,将样式写在一个以.c ...

  4. python爬虫入门一:爬虫基本原理

    1. 什么是爬虫 爬虫就是请求网站并提取数据的自动化程序 2. 爬虫的基本流程 1)发送请求 通过HTTP库向目标站点发送请求,即发送一个Request. 请求可以包含额外的headers等信息,等待 ...

  5. LeetCode 637. Average of Levels in Binary Tree(层序遍历)

    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...

  6. Mysql 使用命令及 sql 语句示例

    Mysql 是数据库开发使用的主要平台之一.sql 的学习掌握与使用是数据库开发的基础,此处展示详细sql 语句的写法,及各种功能下的 sql 语句. 在此处有 sql 语句使用示例:在这里 此处插入 ...

  7. jquery 元素文本取值/赋值

    select元素选中option值 jq $("#select1 option:selected").text(); $("select id或class option: ...

  8. spring cloud 学习资源

    1.https://blog.csdn.net/column/details/17737.html 2.https://blog.csdn.net/column/details/15197.html? ...

  9. Java-获取Class对象的名称

    package com.tj; public class MyClass2 { public static void main(String[] args) { Class cls = java.la ...

  10. div+css居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...