zoukankan      html  css  js  c++  java
  • 什么是阻塞队列?阻塞队列的实现原理是什么?如何使用 阻塞队列来实现生产者-消费者模型?

    阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。

    这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当

    队列满时,存储元素的线程会等待队列可用。

    阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消

    费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者

    也只从容器里拿元素。

    JDK7 提供了 7 个阻塞队列。分别是

    ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。

    LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。

    PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。

    DelayQueue:一个使用优先级队列实现的无界阻塞队列。

    SynchronousQueue:一个不存储元素的阻塞队列。

    LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。

    LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

    Java 5 之前实现同步存取时,可以使用普通的一个集合,然后在使用线程的协作

    和线程同步可以实现生产者,消费者模式,主要的技术就是用好,

    wait ,notify,notifyAll,sychronized 这些关键字。而在 java 5 之后,可以使用阻

    塞队列来实现,此方式大大简少了代码量,使得多线程编程更加容易,安全方面

    也有保障。

    BlockingQueue 接口是 Queue 的子接口,它的主要用途并不是作为容器,而是

    作为线程同步的的工具,因此他具有一个很明显的特性,当生产者线程试图向

    BlockingQueue 放入元素时,如果队列已满,则线程被阻塞,当消费者线程试图

    从中取出一个元素时,如果队列为空,则该线程会被阻塞,正是因为它所具有这

    个特性,所以在程序中多个线程交替向 BlockingQueue 中放入元素,取出元素,

    它可以很好的控制线程之间的通信。

    阻塞队列使用最经典的场景就是 socket 客户端数据的读取和解析,读取数据的线

    程不断将数据放入队列,然后解析线程不断从队列取数据解析。

  • 相关阅读:
    【Leetcode】23. Merge k Sorted Lists
    【Leetcode】109. Convert Sorted List to Binary Search Tree
    【Leetcode】142.Linked List Cycle II
    【Leetcode】143. Reorder List
    【Leetcode】147. Insertion Sort List
    【Leetcode】86. Partition List
    jenkins 配置安全邮件
    python 发送安全邮件
    phpstorm 同步远程服务器代码
    phpUnit 断言
  • 原文地址:https://www.cnblogs.com/programb/p/13021030.html
Copyright © 2011-2022 走看看