zoukankan      html  css  js  c++  java
  • java 队列总结queue v3 svv.docxjava 队列总结queue v3 svv.docx atitit. java queue 队列体系总结o7t 1. 队列概念 1 1.1. 队列

    java 队列总结queue v3 svv.docxjava 队列总结queue v3 svv.docx  atitit. java queue 队列体系总结o7t

    1. 队列概念 1

    1.1. 队列的实现 数组vs链表 1

    2. 队列分类 2

    2.1. 顺序队列 vs 循环队列 2

    2.2. 阻塞队列和非阻塞队列 2

    2.3. 单端队列 vs 双端队列 2

    3. 队列的基本运算 入队 出队 读队头 判队空 2

    4. 常见的返回模式  可能报异常 返回布尔值 可能阻塞 3

    5. java.util.Queue接口, 3

    5.1. BlockingQueue 3

    5.2. deque 即双端队列 3

    5.2.1. BlockingDeque接口 4

    6. ConcurrentLinkedQueue implements Queue 4

    7. BlockingQueue阻塞队列 4

    7.1. 1. ArrayBlockingQueue 5

    7.2. 2. LinkedBlockingQueue 5

    7.3. 3. DelayQueue 5

    7.4. 4. PriorityBlockingQueue 5

    7.5. SynchronousQueue 6

    8. LinkedBlockingDeque 乃阻塞双端队列 6

    9. 参考 6

     

     

    1. 队列概念

    队列

     

    (常用数据结构之一)

     锁定

    本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

     

      1. 队列的实现 数组vs链表

     

    1. 队列分
      1. 顺序队列 vs 循环队列
      2. 阻塞队列和非阻塞队列

    多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。

    同步是阻塞模式,异步是非阻塞模式 

     

    .阻塞队列和非阻塞队列的区别:阻塞队列可以阻塞,非阻塞队列不能阻塞,只能使用队列wait(),notify()进行队列消息传送。而阻塞队列当队列里面没有值时,会阻塞直到有值输入。输入也一样,当队列满的时候,会阻塞,直到队列不为空。

     

      1. 单端队列 vs 双端队列

     

    作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

    转载请注明来源: http://blog.csdn.net/attilax

     

     

    1. 队列的基本运算 入队 出队 读队头 判队空

    (1)初始化队列:Init_Queue(q) ,初始条件:队q 不存在。操作结果:构造了一个空队;

    (2)入队操作: In_Queue(q,x),初始条件: 队q 存在。操作结果: 对已存在的队列q,插入一个元素x 到队尾,队发生变化;

    (3)出队操作: Out_Queue(q,x),初始条件: 队q 存在且非空,操作结果: 删除队首元素,并返回其值,队发生变化;

    (4)读队头元素:Front_Queue(q,x),初始条件: 队q 存在且非空,操作结果: 读队头元素,并返回其值,队不变;

    (5)判队空操作:Empty_Queue(q),初始条件: 队q 存在,操作结果: 若q 为空队则返回为1,否则返回为0。 [

     

    1. 常见的返回模式  可能报异常 返回布尔值 可能阻塞

     

    1.  java.util.Queue接口,

     

       在java5中新增加了java.util.Queue接口,

     

    用以支持队列的常见操作。该接口扩展了java.util.Collection接口。
    Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优
    点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用
    element()或者peek()方法。
    值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

     

    继承体系

     Queue<E> extends Collection<E> extends Iterable<E>

      1. BlockingQueue
      2.  deque 即双端队列

    deque 即双端队列。是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行

     

        1. BlockingDeque接口

     

    1. ConcurrentLinkedQueue implements Queue

    ConcurrentLinkedQueue<E> extends AbstractQueue<E> implements Queue<E>

    1. BlockingQueue阻塞队列

    BlockingQueue不光实现了一个完整队列所具有的基本功能,同时在多线程环境下,他还自动管理了多线间的自动等待于唤醒功能,从而使得程序员可以忽略这些细节,关注更高级的功能。

    阻塞实现通常使用加锁上实现...

    常见BlockingQueue


    在了解了BlockingQueue的基本功能后,让我们来看看BlockingQueue家庭大致有哪些成员?

     

    首先,看看BlockingQueue提供的常用方法:
     

    可能报异常

    返回布尔值

    可能阻塞

    设定等待时间

    入队

    add(e)

    offer(e)

    put(e)

    offer(e, timeout, unit)

    出队

    remove()

    poll()

    take()

    poll(timeout, unit)

    查看

    element()

    peek()


    • 从上表可以很明显看出每个方法的作用,这个不用多说。我想说的是: add(e) remove() element() 方法不会阻塞线程。当不满足约束条件时,会抛出IllegalStateException 异常。例如:当队列被元素填满后,再调用add(e),则会抛出异常。
    • offer(e) poll() peek() 方法即不会阻塞线程,也不会抛出异常。例如:当队列被元素填满后,再调用offer(e),则不会插入元素,函数返回false。
    • 要想要实现阻塞功能,需要调用put(e) take() 方法。当不满足约束条件时,会阻塞线程。



    BlockingQueue成员详细介绍

      1. 1. ArrayBlockingQueue
      2. 2. LinkedBlockingQueue

    基于链表的阻塞队列

      1. 3. DelayQueue

    DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素

      1. 4. PriorityBlockingQueue

    基于优先级的阻塞队列(优先级的判断通过构造 函数传入的Compator对象来决定),但需要注意的是PriorityBlockingQueue并不会阻塞数据生产者,而只会在没有可消费的数据 时,阻塞数据的消费者。因此使用的时候要特别注意,生产者生产数据的速度绝对不能快于消费者消费数据的速度,否则时间一长,会最终耗尽所有的可用堆内存空 间。在实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁。

      1. SynchronousQueue
    1. LinkedBlockingDeque 乃阻塞双端队列 

    ArrayDeque 双向队列
    LinkedBlockingDeque 阻塞双端队列
    ArrayBlockingQueue 双向并发阻塞队列
    LinkedBlockingQueue FIFO队列
    ConcurrentLinkedQueue 基于链接节点的无界线程安全队列
    PriorityBlockingQueue 带优先级的无界阻塞队列
    还有很多很多,可以看看AbstractQueue, Deque有哪些实现类。

    1. 参考

    java中线程队列BlockingQueue的用法-shwenwen-ITPUB博客.htm

    Java并发包中的同步队列SynchronousQueue实现原理 _ 并发编程网 - ifeve.com.htm

    Java多线程总结之线程安全队列Queue - 火木棉的日志 - 网易博客.htm

  • 相关阅读:
    二进制位运算
    Leetcode 373. Find K Pairs with Smallest Sums
    priority_queue的用法
    Leetcode 110. Balanced Binary Tree
    Leetcode 104. Maximum Depth of Binary Tree
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 64. Minimum Path Sum
    Leetcode 63. Unique Paths II
    经典的递归练习
    案例:java中的基本排序
  • 原文地址:https://www.cnblogs.com/attilax/p/15197377.html
Copyright © 2011-2022 走看看