`
kanpiaoxue
  • 浏览: 1777880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java concurrent Queue

    博客分类:
  • java
阅读更多

Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构

 

offer,add区别:

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。 

 

poll,remove区别:

remove() 和 poll() 方法都是从队列中删除第一个元素(head)。remove() 的行为与 Collection 接口的版本相似,

但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

 

peek,element区别:

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

 

-----------------------------------------------------------------------------------------

Tiger中有2组Queue的实现:实现了新的BlockingQueue接口的

和没有实现的

 

-------------------------------------------------------------

没有实现的阻塞接口的:LinkedList: 实现了java.util.Queue接口

java.util.AbstractQueue

内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue

 

PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。 

 

PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。

 

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

 

------------------------------------------------------------------

实现阻塞接口的:

 

新的 java.util.concurrent 包在 Collection Framework 中可用的具体集合类中加入了 BlockingQueue 接口和五个阻塞队列类。

 

它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。

 

五个队列所提供的各有不同:

 

* ArrayBlockingQueue :一个由数组支持的有界队列。

* LinkedBlockingQueue :一个由链接节点支持的可选有界队列。

* PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。

* DelayQueue :一个由优先级堆支持的、基于时间的调度队列。

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

 

 

前两个类 ArrayBlockingQueue 和 LinkedBlockingQueue 几乎相同,只是在后备存储器方面有所不同, LinkedBlockingQueue 并不总是有容量界限。无大小界限的 LinkedBlockingQueue 类在添加元素时永远不会有阻塞队列的等待(至少在其中有Integer.MAX_VALUE 元素之前不会)。

 

PriorityBlockingQueue 是具有无界限容量的队列,它利用所包含元素的 Comparable 排序顺序来以逻辑顺序维护元素。可以将它看作 TreeSet 的可能替代物。不过对 PriorityBlockingQueue 有一个技巧。从 iterator() 返回的 Iterator 实例不需要以优先级顺序返回元素。如果必须以优先级顺序遍历所有元素,那么让它们都通过 toArray() 方法并自己对它们排序,像 Arrays.sort(pq.toArray())。

 

新的 DelayQueue 实现可能是其中最有意思(也是最复杂)的一个。加入到队列中的元素必须实现新的 Delayed 接口(只有一个方法 —— long getDelay(java.util.concurrent.TimeUnit unit) )。因为队列的大小没有界限,使得添加可以立即返回,但是在延迟时间过去之前不能从队列中取出元素。如果多个元素完成了延迟,那么最早失效/失效时间最长的元素将第一个取出。实际上没有听上去这样复杂。

 

SynchronousQueue 类是最简单的。它没有内部容量。它就像线程之间的手递手机制。在队列中加入一个元素的生产者会等待另一个线程的消费者。当这个消费者出现时,这个元素就直接在消费者和生产者之间传递,永远不会加入到阻塞队列中。

 

----------------------------------------------

实验结果:

 

文档说BlockingQueue的队列: 不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。

 

实验了一下,使用put、take是这样子的,线程在等待

而使用offer是立刻返回false的

 

---------// 引用自: http://zybing.itpub.net/post/170/376271

分享到:
评论

相关推荐

    java 自定义Queue队列

    同时,还需要处理并发访问时的线程安全问题,如果队列将在多线程环境下使用,可能需要使用`synchronized`关键字或者`java.util.concurrent`包中的锁来保证线程安全。 `Java.jpg`可能是用来辅助理解队列概念的图片,...

    java并发工具包 java.util.concurrent中文版pdf

    `BlockingQueue` 是 `java.util.concurrent` 包中的一个接口,它扩展了传统的 `Queue` 接口,并引入了阻塞特性。这意味着当队列为空时,从队列中移除元素的操作将会阻塞;同样地,当队列满时,向队列添加元素的操作...

    java.util.concurrent 实现线程池队列

    `java.util.concurrent` 包(简称JUC)是Java提供的一个强大的并发工具包,它提供了丰富的并发组件,如线程池、并发容器、锁和同步机制等,极大地简化了并发编程的复杂性。本篇文章将深入探讨如何使用`java.util....

    The java.util.concurrent Synchronizer Framework

    ### Java.util.concurrent同步器框架详解 #### 概述 Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一系列中等层次的并发支持类集合,通过Java社区过程(Java Community Process, JCP)的Java规范...

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

    `java.util.concurrent`包下的`ExecutorService`和`ThreadPoolExecutor`是实现线程池的关键类。通过指定核心线程数、最大线程数、线程空闲时间等参数,我们可以定制适合应用需求的线程池。提交任务到线程池通常使用`...

    javaconcurrent源码-java7-source-code:Java7源码/Concurrency同步

    Map/List/Queue 阻塞队列 JUC锁: CountDownLatch 闭锁 AQS 锁的公共类 20180514 String, 部分Character 20180508 除 Set 外, 常用的 Collection 都已经分析完毕 简化语言描述, 增加测试用例(实践用法) 接触到新的类...

    java队列之queue用法实例分析

    实现阻塞接口的Queue包括java.util.concurrent中的BlockingQueue接口和五个阻塞队列类。BlockingQueue接口是一个带有一点扭曲的FIFO数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者...

    Java数据结构实现之Queue.zip

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

    QueueMonitor:使用 Java 的队列监视器

    在Java中,我们可以利用`java.util.concurrent`包下的`BlockingQueue`接口及其实现类来创建这样的监视器。`BlockingQueue`提供了线程安全的队列操作,支持阻塞式插入和移除,非常适合在多线程环境中使用。 1. **`...

    Concurrent Queue Exerciser:展示并发双端队列是如何工作的。-开源

    练习学习 java 包 java.util.concurrent 并直观地展示并发双端队列的工作原理。

    Java 实例 - 队列(Queue)用法源代码-详细教程.zip

    3. **阻塞队列(BlockingQueue)**:`java.util.concurrent`包下的`BlockingQueue`接口扩展了Queue接口,并添加了线程安全的阻塞操作,如`put(E e)`、`take()`等。这些方法会在队列满时阻塞生产者,空时阻塞消费者,...

    Concurrent In java

    ### Concurrent in Java: 并发编程的关键概念与技术 #### 一、概述 在现代软件开发中,并发编程是一项至关重要的技术,特别是在多核处理器普及的今天。Java平台提供了丰富的并发编程工具,其中`java.util....

    DataStructure-Queue

    - **并发队列(Concurrent Queue)**:在多线程环境中,允许多个线程同时进行入队和出队操作,通常需要复杂的同步机制,如Java的`java.util.concurrent`包中的队列。 通过分析这个项目的代码,我们可以学习到如何在...

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

    Java还提供了一些同步机制,如 `synchronized` 关键字、`wait()`, `notify()` 和 `notifyAll()` 方法,以及 `java.util.concurrent` 包中的高级并发工具。 ```java class MyRunnable implements Runnable { public...

    Queue-Simulation_java_learnvwf_源码.zip

    此外,项目可能还涉及事件驱动编程,使用Java的`java.util.concurrent`包中的`ExecutorService`和`Future`接口来调度任务执行和处理结果。这在处理大量并发请求时尤其有用,能够有效地管理线程资源并控制任务的执行...

    Java_0613_java_源码

    这个主题涉及到Java并发库中的`java.util.concurrent.PriorityBlockingQueue`类,它是线程安全的,适用于高并发场景。 首先,`PriorityBlockingQueue`实现了`BlockingQueue`接口,这意味着它支持阻塞插入(put)和...

    java生产者消费者

    Java的`java.util.concurrent`包提供了多种阻塞队列实现,如ArrayBlockingQueue、LinkedBlockingQueue等。生产者通过`offer()`方法将元素放入队列,消费者则用`take()`方法取出元素。当队列满时,`offer()`会阻塞...

    Java1.6api

    5. **多线程**:`java.lang.Thread`类和`java.util.concurrent`包提供了多线程编程的支持,包括线程的创建、同步控制、线程池管理等。 6. **日期和时间**:在Java 1.6中,`java.util.Date`和`Calendar`类是处理日期...

    米哈游笔试题目-Java方向.docx

    import java.util.concurrent.LinkedBlockingQueue; public class SafeBlockingQueue<T> { private final BlockingQueue<T> queue; public SafeBlockingQueue(int capacity) { this.queue = new ...

    Java6 API 中文

    2. **集合框架**:在Java 6中,集合框架是一个重要的部分,它提供了多种数据结构,如列表(List)、队列(Queue)、集(Set)和映射(Map)。`java.util.ArrayList`和`java.util.LinkedList`是两种常见的列表实现,...

Global site tag (gtag.js) - Google Analytics