• 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

  • 相关阅读:
    SwitchHosts——一个快速切换host的小工具
    Electron——node_modulesffi-napiuildReleaseffi_bindings.node is not a valid Win32 application.
    NPM——Electron failed to install correctly, please delete node_modules/electron and try
    alpakka-kafka(8)-kafka数据消费模式实现
    alpakka-kafka(7)-kafka应用案例,消费模式
    alpakka-kafka(6)-kafka应用案例,用户接口
    如何在Mac中卸载openjdk15
    我的一个切面
    定义一个通用的切面
    Oracle创建用户,创建表空间
  • 原文地址:https://www.cnblogs.com/attilax/p/15197377.html
Copyright © 2020-2023  润新知