`
wx1568520008
  • 浏览: 20416 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于Java 中的Queue

 
阅读更多

一、队列的定义

我们都知道队列(Queue)是一种先进先出(FIFO)的数据结构,Java中定义了java.util.Queue接口用来表示队列。Java中的QueueListSet属于同一个级别接口,它们都是继承于Collection接口。

Java中还定义了一种双端队列java.util.Deque,我们常用的LinkedList就是实现了Deque接口。

二、队列的实现

Java中对于队列的实现分为非阻塞阻塞两种。

$ 非阻塞队列分为如下:

  • LinkedList

    LinkedList是双相链表结构,在添加和删除元素时具有比ArrayList更好的性能。但在 Get 与 Set 方面弱于ArrayList。当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比。

  • PriorityQueue

    PriorityQueue维护了一个有序列表,存储到队列中的元素会按照自然顺序排列。当然,我们也可以给它指定一个实现了 java.util.Comparator 接口的排序类来指定元素排列的顺序。

  • ConcurrentLinkedQueue

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

$ 阻塞队列分为如下:

阻塞队列定义在了java.util.concurrent包中,java.util.concurrent.BlockingQueue 继承了Queue接口,它有 5 个实现类,分别是:

  • ArrayBlockingQueue 

    一个内部由数组支持的有界队列。初始化时必须指定队列的容量,还可以设置内部的ReentrantLock是否使用公平锁。但是公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队列,此队列按 FIFO(先进先出)原则对元素进行排序。

    它的思想就是如果BlockQueue是空的,那么从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒。同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作。

  • LinkedBlockingQueue 

    一个内部由链接节点支持的可选有界队列。初始化时不需要指定队列的容量,默认是Integer.MAX_VALUE,也可以看成容量无限大。此队列按 FIFO(先进先出)排序元素 。

  • PriorityBlockingQueue 

    一个内部由优先级堆支持的无界优先级队列。PriorityBlockingQueue是对 PriorityQueue的再次包装,队列中的元素按优先级顺序被移除。

  • DelayQueue 

    一个内部由优先级堆支持的、基于时间的调度队列。队列中存放Delayed元素,只有在延迟期满后才能从队列中提取元素。当一个元素的getDelay()方法返回值小于等于0时才能从队列中poll中元素,否则poll()方法会返回null。  

  • SynchronousQueue 

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

下面简单介绍一下其中常用的方法:

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

转载于:https://my.oschina.net/u/4167465/blog/3093316

分享到:
评论

相关推荐

    java 自定义Queue队列

    在Java编程语言中,`Queue`接口是集合框架的一部分,它代表了先进先出(FIFO)的数据结构,也就是我们通常所说的队列。队列是一种非常基础且实用的数据结构,广泛应用于多线程同步、任务调度、缓存管理等多个场景。...

    11.javaQueue 接口及其实现类.zip

    11.javaQueue 接口及其实现类.zip11.javaQueue 接口及其实现类.zip11.javaQueue 接口及其实现类.zip11.javaQueue 接口及其实现类.zip11.javaQueue 接口及其实现类.zip11.javaQueue 接口及其实现类.zip11.javaQueue ...

    java中queue接口的使用详解

    Java中的`Queue`接口是Java集合框架的一部分,它位于`java.util`包中,是`Collection`接口的子接口。`Queue`接口主要用于实现队列数据结构,它遵循先进先出(FIFO)的原则,即最先添加的元素会被最先移除。在Java中...

    Using_Java_Queue.zip_java队列

    Java队列是Java集合框架中的一个关键组成部分,主要用于在多个线程之间同步数据传输或实现异步处理。队列遵循先进先出(FIFO)的原则,即最早添加到队列中的元素将首先被处理。本教程将深入探讨如何在Java中使用队列...

    一文弄懂java中的Queue家族

    java中Queue家族简介 简介 java中Collection集合有三大家族List,Set和Queue。当然Map也算是一种集合类,但Map并不继承Collection接口。 List,Set在我们的工作中会经常使用,通常用来存储结果数据,而Queue由于它的...

    JAVA 数据结构之Queue处理实例代码

    本篇文章将深入探讨Java中的Queue数据结构,并通过具体的实例代码来展示其使用。 Queue是一种先进先出(First In First Out, FIFO)的数据结构,意味着最先添加到队列中的元素将最先被移除。在Java中,`java.util....

    FCFS.rar_Java fcfs_Queue systems java_fcfs _queue java_处理机调度

    在这个Java实现的FCFS调度系统中,我们主要探讨以下几个关键知识点:** 1. **FCFS调度算法原理** FCFS调度算法是最简单的调度策略,它将CPU时间分配给最早到达就绪队列的进程。该算法对短进程不利,因为它们可能...

    JMS Message Queue 实例

    是一个快速的开源消息组件(框架),支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,和J2EE1.4容器无缝结合,并且支持轻量级容器和大多数跨语言客户端上的Java虚拟机。消息异步接受,减少软件多系统集成...

    Queue.java

    Queue.java

    java定时器+多线程(池)+java队列Demo

    Java中的`java.util.Queue`接口提供了多种队列实现,如`ArrayDeque`、`LinkedList`和`PriorityQueue`。队列可以用于任务调度,例如,`ExecutorService`的`submit`方法将任务放入内部队列,由线程池按顺序处理。此外...

    java客户端从MQ队列接收消息的三种方法

    在Java中,与Message Queuing (MQ) 交互是企业级应用中常见的需求,用于解耦应用程序并提高系统的可扩展性。本篇文章将详细介绍三种不同的方法,帮助Java客户端从MQ队列接收消息。 1. **IBM WebSphere MQ JMS API**...

    Queue-using-linked-list.zip_queue java

    本压缩包文件“Queue-using-linked-list.zip_queue java”显然是关于如何使用链表实现Java中的队列。下面将详细阐述这个主题。 ### 链表和队列的概念 **链表** 是一种线性数据结构,它的元素(节点)在内存中不是...

    java-leetcode题解之Implement Queue Using Stacks.java

    java java_leetcode题解之Implement Queue Using Stacks.java

    java-leetcode题解之Implement Queue Using Array.java

    java java_leetcode题解之Implement Queue Using Array.java

    java队列之queue用法实例分析

    加入到Queue中的元素根据它们的天然排序(通过其java.util.Comparable实现)或者根据传递给构造函数的java.util.Comparator实现来定位。ConcurrentLinkedQueue是基于链接节点的、线程安全的队列。并发访问不需要同步...

    Queue在多线程中的使用

    项目中模拟两个线程,一个线程不断产生数据(例如网络或者蓝牙不断的发数据过来,采用定时器每一段时间接受一次数据)并往队列中插入数据,另一个线程不断的将队列中的数据读出并存到一个txt文件中,因为往硬盘或者...

    Java数据结构实现之Queue.zip

    本篇文章将深入探讨Java中队列(Queue)数据结构的实现。 队列是一种线性数据结构,遵循“先进先出”(FIFO,First In First Out)的原则。它的一端称为前端(Front)或头,另一端称为后端(Rear)。新元素在后端...

    Queue与Topic的比较

    Queue 和 Topic 是 JMS(Java Message Service)中两种基本的消息模式,分别对应 Point-to-Point 和 Publish/Subscribe 模式。 Queue 模式 在 Queue 模式中,一条消息仅能被一个消费者(Consumer)接收。如果在...

    利用Vector类(继承)编写一个先进先出的队列类Queue java实现

    本篇文章将详细介绍如何利用Java中的`Vector`类来实现一个具有先进先出特性的队列类`Queue`。队列是一种特殊的线性表,只允许在一端进行插入操作,在另一端进行删除操作。通常,我们称允许插入的一端为“队尾”,...

Global site tag (gtag.js) - Google Analytics