欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java队列Queue及阻塞队列

程序员文章站 2022-05-14 09:42:25
java队列 接口Queue类在java.util包,定义了以下6个方法 详细查看官方文档https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html 什么是阻塞队列 BlockingQueue 队列是一种数据结构,它的特点是先进先出( ......

java队列

接口queue类在java.util包,定义了以下6个方法

java队列Queue及阻塞队列

详细查看官方文档https://docs.oracle.com/javase/7/docs/api/java/util/queue.html

什么是阻塞队列 blockingqueue

  队列是一种数据结构,它的特点是先进先出(first in first out),它有两个基本操作:在队列尾部加入一个元素,从队列头部移除一个元素。队列在多线程应用中,常用于生产-消费场景。

  blockingqueue 是 java util.concurrent 包下重要的数据结构,blockingqueue 提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于 blockingqueue 实现的。

  blockingqueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下:java队列Queue及阻塞队列

  按照上图,我们可以知道jdk1.5中的阻塞队列的操作:

  add        增加一个元索                     如果队列已满,则抛出一个iiiegaislabeepeplian异常
  remove   移除并返回队列头部的元素    如果队列为空,则抛出一个nosuchelementexception异常
  element  返回队列头部的元素             如果队列为空,则抛出一个nosuchelementexception异常
  offer       添加一个元素并返回true       如果队列已满,则返回false
  poll         移除并返问队列头部的元素    如果队列为空,则返回null
  peek       返回队列头部的元素             如果队列为空,则返回null
  put         添加一个元素                      如果队列满,则阻塞
  take        移除并返回队列头部的元素     如果队列为空,则阻塞

blockingqueue 是个接口,你需要使用它的实现之一来使用 blockingqueue,java.util.concurrent 包下具有以下 blockingqueue 接口的实现类:

arrayblockingqueue :一个由数组支持的有界队列。
linkedblockingqueue :一个由链接节点支持的可选有界队列。
priorityblockingqueue :一个由优先级堆支持的*优先级队列。
delayqueue :一个由优先级堆支持的、基于时间的调度队列。
synchronousqueue :一个利用 blockingqueue 接口的简单聚集(rendezvous)机制。

  arrayblockingqueue:arrayblockingqueue 是一个有界的阻塞队列,其内部实现是将对象放到一个数组里。有界也就意味着,它不能够存储无限多数量的元素。它有一个同一时间能够存储元素数量的上限。你可以在对其初始化的时候设定这个上限,但之后就无法对这个上限进行修改了。

  delayqueue:delayqueue 对元素进行持有直到一个特定的延迟到期。注入其中的元素必须实现 java.util.concurrent.delayed 接口。

  linkedblockingqueue:linkedblockingqueue 内部以一个链式结构对其元素进行存储。如果需要的话,这一链式结构可以选择一个上限。如果没有定义上限,将使用 integer.max_value 作为上限。

  priorityblockingqueue:priorityblockingqueue 是一个*的并发队列。它使用了和类 java.util.priorityqueue 一样的排序规则。你无法向这个队列中插入 null 值。所有插入到 priorityblockingqueue 的元素必须实现 java.lang.comparable 接口。因此该队列中元素的排序就取决于你自己的 comparable 实现。

  synchronousqueue:synchronousqueue 是一个特殊的队列,它的内部同时只能够容纳单个元素。如果该队列已有一元素的话,试图向队列中插入一个新元素的线程将会阻塞,直到另一个线程将该元素从队列中抽走。同样,如果该队列为空,试图向队列中抽取一个元素的线程将会阻塞,直到另一个线程向队列中插入了一条新的元素。据此,把这个类称作一个队列显然是夸大其词了。它更多像是一个汇合点。

 

然后可以联系到java集合 list,set

java队列Queue及阻塞队列

java框架集合图