`
softbear
  • 浏览: 39421 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java中的阻塞队列和性能对比

    博客分类:
  • java
阅读更多
java.util.PriorityQueue<E>
 

E 集合中所保存元素的类型。

public class PriorityQueue extends AbstractQueue implements Serializable
 

一个基于优先级堆的极大优先级队列。此队列按照在构造时所指定的顺序对元素排序,既可以 根据元素的自然顺序(Comparable)来指定排序,也可以根据Comparator来指定,这取决于使用那种构造方法。优先级队列不允许null元 素。依靠自然排序的优先级队列还不允许插入不可比较的对象,这样做可能导致ClassCastException。

此队列的头是按指定排序的最小元素。如果有多个元素都是最小值,则头是其中一个元素——选择方法是任意的。队列检索操作poll , remove , peek 和 element访问处于队列头的元素。

优先级队列是无界的,但是有一个内部容量,控制着用于存储队列元素的数组的大小。它总是至少与队列的大小相同。随着不断向优先级队列中添加元素,其容量会自动增加。无需指定容量增加策略的细节。

注意,此实现不是同步的。如果多个线程中的任意线程从结构上修改了列表,则这些线程不应同时访问PriorityQueue实例。相反,请使用线程安全的PriorityBlockingQueue类。

接口BlockingQueue<E>

public interface BlockingQueue<E> extends Queue<E>
 

支持两个附加操作的Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。

BlockingQueue不接受null元素。

BlockingQueue可以是限定容量的。

BlockingQueue实现主要用于生产者-使用者队列,但它另外还支持Collection接口。因此,举例来说,使用remove(x)从队列中移除任意一个元素是有可能的。然而,这种操作通常不会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。

BlockingQueue实现是线程安全的。注意,BlockingQueue可以安全地与多个生产者和多个使用者一起使用。


class Producer implements Runnable {
   private final BlockingQueue queue;
   Producer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while(true) { queue.put(produce()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   Object produce() { ... }
}

class Consumer implements Runnable {
   private final BlockingQueue queue;
   Consumer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while(true) { consume(queue.take()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   void consume(Object x) { ... }
}

class Setup {
   void main() {
     BlockingQueue q = new SomeQueueImplementation();
     Producer p = new Producer(q);
     Consumer c1 = new Consumer(q);
     Consumer c2 = new Consumer(q);
     new Thread(p).start();
     new Thread(c1).start();
     new Thread(c2).start();
   }
}
 

此接口是Java Collecitons Framework的成员。


类PriorityBlockingQueue


public class PriorityBlockingQueue<E>

extends AbstractQueue<E> implments BlockingQueue<E> ,Serializable
 

一个无界的阻塞队列,它使用与类PriorityQueue相同的顺序规则,并且提供了 阻塞检索的操作。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会失败,导致OutOfMemoryError。此类不允许使 用null元素,依赖自然顺序的优先级队列也不允许插入不可比较的对象。

如果需要有序的遍历,则应考虑使用Arrays.sort(pq.toArray())


接口Compara<T>

public interface Comparable<T>
 

此接口强行对实现它的每个类的对象进行整体排序。次排序被称为该类的自然排序,类的 compareTo方法被称为它的自然比较方法。实现此接口的对象列表和数组可以通过Collections.sort(和Arrays.sort)进行 自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。


阻塞队列的性能对比

主要是比较offer跟poll两个方法的性能,开N个线程,每个线程往队列里写或者取500个整数。线程数 20 50 100 200 500 1000
LinkedBlockingQueue     15,0 31,15 32,16 63,32 203,47 563,110
ArrayBlockingQueue 15,0 16,15 31,15 47,16 125,47 364,68
PriorityBlockingQueue 78,78 172,188 360,422 813,969 3094,2641 6547,5453


逗号前的数字是offer测试花费的时间,逗号后的数字是poll测试花费的时间。
结论:
1、ArrayBlockingQueue性能优于LinkedBlockingQueue,但是LinkedBlockingQueue是无界的。
2、ArrayBlockingQueue和LinkedBlockingQueue的poll方法总是比offer方法快,并发越高,差距越大
3、ArrayBlockingQueue和LinkedBlockingQueue的性能远高于PriorityBlockingQueue,显然优先队列在比较优先级上的操作上耗费太多
4、PriorityBlockingQueue的offer方法与poll方法的性能差距很小,基本维持在近似1:1

分享到:
评论

相关推荐

    阻塞队列阻塞队列阻塞队列

    在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...

    剖析Java中阻塞队列的实现原理及应用场景

    总结来说,Java中的阻塞队列通过提供一种线程间的协作机制,使得生产者和消费者能有效地共享资源,减少了不必要的竞争和同步开销。不同类型的阻塞队列各有特点,可以根据具体的应用场景和性能需求选择合适的队列类型...

    Java中的阻塞队列详细介绍

    在实际应用中,选择合适的阻塞队列类型取决于具体需求,如是否需要优先级、队列大小、性能和内存消耗等。例如,如果需要执行定时任务,DelayQueue是一个理想的选择;对于高并发且对性能敏感的情况,...

    元素唯一的LinkedBlockingQueue阻塞队列

    在Java并发编程中,`LinkedBlockingQueue`是一种基于链表结构的阻塞队列,它在多线程环境下的性能表现优秀,常用于实现生产者消费者模型。这个队列的一个关键特性是其内部节点的链接方式,即每个元素都是一个节点,...

    10、阻塞队列BlockingQueue实战及其原理分析

    阻塞队列BlockingQueue是Java并发编程中一个重要的数据结构,它是线程安全的队列,主要用于生产者消费者模型中的数据交换。在Java的`java.util.concurrent`包中,提供了多种实现阻塞队列的类,如`ArrayBlockingQueue...

    java队列

    总之,Java队列是并发编程和数据结构中的重要概念,理解和熟练运用各种队列类型能够提高程序的效率和并发性能。通过阅读《Java队列》这篇博文,读者可以学习到如何在Java中正确地使用和实现队列,以及如何利用队列...

    Java消息队列常见面试题2022

    Java消息队列(Java ...以上内容只是Java消息队列面试准备的一部分,实际面试中还可能涉及到更多具体的技术细节和实际应用案例。通过深入学习和实践,你可以更好地理解和运用这些知识,提升自己在面试中的竞争力。

    Java NIO与IO性能对比分析.pdf

    在性能对比测试中,实验结果表明,基于NIO的新服务器模型在处理高并发时,平均响应时间仅为2.09毫秒,且CPU占用率保持在68.5%的较低水平。与之相比,传统IO服务器模型在处理并发流量时,不仅性能上无法达到新模型的...

    Java 阻塞队列详解及简单使用

    Java 阻塞队列(BlockingQueue)...总的来说,Java阻塞队列是一个强大的工具,它简化了多线程环境下的数据共享和线程同步,提高了系统的效率和可维护性。了解并熟练使用阻塞队列,对于编写高性能并发应用程序至关重要。

    Java并发大神Doug Lee同步队列论文

    论文中详细介绍了这两种同步队列的设计原理、实现细节以及性能评估,并将其与Java SE 5.0中的`SynchronousQueue`类进行了对比。 #### 同步队列的重要性 同步队列作为一种特殊类型的队列,它在并发编程中扮演着重要...

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

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

    队列(数据结构--Java版)

    在Java中创建和使用队列的示例代码如下: ```java import java.util.LinkedList; import java.util.Queue; public class QueueExample { public static void main(String[] args) { // 创建一个 LinkedList 队列...

    Java_0613_java_源码

    在Java编程语言中,"优先阻塞队列"(Priority Blocking Queue)是一个高效且功能强大的数据结构,它结合了队列的先进先出(FIFO)原则与堆的优先级特性。优先阻塞队列主要用在多线程环境中,为并发处理提供了便利。...

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

    4. **PriorityBlockingQueue**:支持优先级的无界阻塞队列,按照自然顺序或自定义比较器进行排序。 使用`ThreadPoolExecutor` 创建线程池的基本代码如下: ```java int corePoolSize = 5; int maximumPoolSize = ...

    消息队列延迟定时任务

    为了解决这个问题,可以考虑使用`BLPOP`或`BRPOP`命令在消息队列中阻塞等待新任务,或者使用Redis的`Redisson`库,它提供了延迟队列的功能,能够更高效地处理延迟任务。 总的来说,通过Redis的有序集合和Java的定时...

    无锁队列

    5. 分析和对比无锁队列与其他并发数据结构(如阻塞队列、同步队列)的性能差异。 通过以上的学习,你将能够掌握无锁队列的基本原理和应用场景,提升你的并发编程能力。在《Java并发编程实战》等书籍中,也可以找到...

    09队列:队列在线程池等有限资源池中的应用.pdf

    在Java中,ArrayBlockingQueue就是一个基于数组实现的阻塞队列。它内部通过维护一个数组和两个指针(head和tail)来实现队列操作。ArrayBlockingQueue提供了线程安全的入队和出队操作,保证了多线程环境下的队列操作...

    Java 队列 Queue 用法实例详解

    例如,`ArrayBlockingQueue`是固定大小的阻塞队列,适用于生产者-消费者模型;`PriorityQueue`则是一个无界的优先级队列,其中的元素按照自然顺序或自定义比较器进行排序。 在实际开发中,选择合适的队列类型对于...

Global site tag (gtag.js) - Google Analytics