阻塞队列 阻塞队列 什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。...队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。...队列中的Delayed必须实现compareTo来指定元素的顺序。比如让延时时间最长的放在队列的末尾。...在初始化LinkedBlockingDeque时可以初始化队列的容量,用来防止其再扩容时过渡膨胀。另外双向阻塞队列可以运用在“工作窃取”模式中。...让我们先来看看JDK是如何实现的。 使用通知模式实现。所谓通知模式,就是当生产者往满的队列里添加元素时会阻塞住生产者,当消费者消费了一个队列中的元素后,会通知生产者当前队列可用。
一丶什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个可以进行阻塞插入和阻塞移除的附加方法的队列。 1)阻塞插入:当队列满后,队列会阻塞(拒绝)插入元素,直到队列不满。...---- 二丶JDK提供的7个阻塞队列 ArrayBlockingQueue:由数组结构组成的有界阻塞队列 LinkedBlockingQueue:由链表结构组成的有界阻塞队列 PriorityBlockingQueue...:支持优先级排序的无界阻塞队列 DelayQueue:使用优先级队列实现的无界阻塞队列 SynchronousQueue:不存储元素的阻塞队列 LinkedTransferQueue:由链表结构组成的无界阻塞队列...LinkedBlockingDeque:由链表结构组成的双向阻塞队列 三丶阻塞队列的实现原理 介绍过阻塞队列后博主想到的第一个应用就是生产者和消费者场景,阻塞队列是如何实现的,那我们可以想象一下用一般的多线程是如何实现生产者和消费者场景的...关于阻塞队列底层实现真的不难(博主那么菜也能看的七分懂),所以就不继续往下面看了,至于其他几种阻塞队列的实现,有空再拜读,感兴趣的小伙伴也可以自己去看看,应该能收获一些有用的知识!
本文转发自:https://blog.csdn.net/u012881904/article/details/51491736 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞...试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。...同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列. 1.ArrayDeque, (数组双端队列) 2....生产者-消费者设计是围绕阻塞队列展开的,生产者把数据放入队列,并使数据可用,当消费者为适当的行为做准备时会从队列中获取数据。...虽然生产者-消费者模式可以把生产者和消费者的代码相互解耦合,但是它们的行为还是间接地通过共享队列耦合在一起了 类库中包含一些BlockingQueue的实现,其中LinkedBlockingQueue和
什么是阻塞队列 原文地址为,转载请注明出处! 阻塞队列是一个支持阻塞的插入和移除的队列。 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。...阻塞队列用法 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里获取元素的线程。...如果是移除方法,则是从队列中取出一个元素,没有则返回null。 一直阻塞:当阻塞队列满时,如果生产者线程往队列里面put元素,则生产者线程会被阻塞,知道队列不满或者响应中断退出。...compareTo()方法来指定排序规则 不支持同优先级元素排序 4.DelayQueue 队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口 只有在延时期满才能从队列中提取元素...所谓通知模式,就是当生产者往满的队列添加元素时会阻塞住生产者,当消费者消费了一个队列中的元素后,会通知生产者当前队列可用。
上次我们讲了一些常用的4个阻塞队列,但是在JDK中还提供了其他的一些阻塞队列。这篇文章将全面介绍一下JDK中的所有阻塞队列,并比较他们的区别。 JDK7提供了7个阻塞队列。...分别是 ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。 ...PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。 DelayQueue:一个使用优先级队列实现的无界阻塞队列。 ...SynchronousQueue:一个不存储元素的阻塞队列。 LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。 ...参考资料: http://www.infoq.com/cn/articles/java-blocking-queue/
(); //当阻塞队列中为空时,使用remove,出现如下错误 java.util.NoSuchElementException //blocking.remove();...offer() 向阻塞队列中插入值时,阻塞队列未满,插入成功后返回 true。...当阻塞队列为空时,消费者线程试图从队列中 take 元素,队列会一直阻塞消费者线程直到队列可用。...,直到有人消费掉阻塞队列中的元素。...,直到有人消费掉阻塞队列中的元素。
自己写一个阻塞队列 阻塞队列,主要操作有两个,一个是put放入元素,另一个是take取出元素。所谓的阻塞就是当多个线程同时存取数据时,如果遇到队列为空或者队列为满时,会发生阻塞。...put: 向队列中存入一个元素,如果已满,则阻塞当前线程,等待唤醒。...如果正常存入了元素,那么唤醒其他阻塞的线程(有些执行take操作的线程因为队列为空而阻塞) take: 从队列中取一个元素,如果队列为空,则阻塞当前线程,等待唤醒。...count.get()==0; } private boolean isFull(){ return count.get()>=array.length; } } JDK中的阻塞队列实现...我们自己写的这个阻塞队列只是实现了最基本的put和take两个操作,而jdk中的阻塞队列提供的功能更加全面一些。
介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满;当队列空时,队列会阻塞获得元素的线程,直到队列变非空。...Java 中的阻塞队列: ArrayBlockingQueue ArrayBlockingQueue 是一个用数组实现的有界阻塞队列。...因为双端队列头尾都可以消费和生产,所以使用了一个共享锁。 双向阻塞队列可以运用在“工作窃取”模式中。...队列中的元素必须实现 Delayed 接口(Delayed 接口的设计可以参考 ScheduledFutureTask 类),元素按延迟优先级排序,延迟时间短的排在前面,只有在延迟期满时才能从队列中提取元素...DelayQueue 中的 PriorityQueue 会对队列中的任务进行排序。排序时,time 小的排在前面(时间早的任务将被先执行)。
1 Java中的阻塞队列 1.1 简介 一种支持两个附加操作的队列,是一系列阻塞队列类的接口 当存取条件不满足时,阻塞在操作处 队列满时,阻塞存储元素的线程,直到队列可用 队列空时,获取元素的线程会等待队列非空...,每个消费者消费10个产品 可以看到,当队列满时,所有生产者被阻塞 当队列空时,所有消费者被阻塞 代码中还用到了AtomicInteger原子整数,用来确保产品的编号不会混乱 2 Java里的阻塞队列...BlockingQueue的实现类 至JDK8,Java提供了7个阻塞队列 ArrayBlockingQueue:数组结构组成的有界阻塞队列 LinkedBlockingQueue:链表结构组成的有界...都是FIFO队列 正如其他Java集合一样,链表形式的队列,其存取效率要比数组形式的队列高 但是在一些并发程序中,数组形式的队列由于具有一定的可预测性,因此可以在某些场景中获得更好的效率 另一个不同点在于...3 阻塞队列的实现原理 Java的并发队列,具体包括BlockingQueue阻塞队列、BlockingDeque阻塞双向队列、TransferQueue传输队列、ConcurrentLinkedQueue
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList)...本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法,接着分析了阻塞队列的实现原理,最后给出了一个实际例子和几个使用场景。 ...一.几种主要的阻塞队列 二.阻塞队列中的方法 VS 非阻塞队列中的方法 三.阻塞队列的实现原理 四.示例和使用场景 若有不正之处请多多谅解,并欢迎批评指正。 ...二.阻塞队列中的方法 VS 非阻塞队列中的方法 1.非阻塞队列中的几个主要方法: add(E e):将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则会抛出异常;...2.阻塞队列中的几个主要方法: 阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注意这5个方法在阻塞队列中都进行了同步措施。
5.7 Queue并发集合 之前,我们介绍了Queue队列。对于队列的相关知识,你应该有了一个大概的了解! 在本篇中,我们会继续深入学习,来了解下线程安全的队列集合!...在Java多线程编程中,生产者消费者模型,想必大家都在熟悉不过了,简单来说就是一部分线程负责向容器中生产,而另一部分线程负责从容器中获取。 在这个模型当中,Java主要利用队列的数据结构进行实现。...为了保证数据的安全,Java提供了两种线程安全的Queue队列,分为阻塞队列和非阻塞队列(并发队列)。...阻塞,顾名思义:当我们的生产者向队列中生产数据时,若队列已满,那么生产线程会暂停下来,直到队列中有可以存放数据的地方,才会继续工作;而当我们的消费者向队列中获取数据时,若队列为空,则消费者线程会暂停下来...在Java中,java.util.concurrent包提供了很多阻塞队列的实现。 其中,包括: ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
接下来,我们来看看ArrayBlockingQueue的源码实现! 构造方法 在多线程中,默认不保证线程公平的访问队列。 什么叫做公平访问队列?...提供了两种不同形式的元素插入--阻塞式和非阻塞式。...对于阻塞式插入来说,当队列中的元素已满时,则会将此线程停止,让其处于等待状态,直到队列中有空余位置产生。...insert(e); } finally { //插入完成,释放锁 lock.unlock(); } } 而对于非阻塞式来说,当队列中的元素已满时...该方法在插入时候,如果队列中的元素满了,则会抛出异常。如果插入成功,则返回true。 在add(E e)中,使用父类的add(E e),实际上其底层也是调用的offer(E e)方法。
阻塞队列的概念 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞 当阻塞队列是满时,往队列里添加元素的操作将会被阻塞 ArrayBlockingQueue 数组组成的有界阻塞队列 代码示例:...(一言不合就报错比较暴力) public static void main(String[] args) throws InterruptedException { // 定义阻塞队列的长度为...{ // 定义阻塞队列的长度为3 BlockingQueue blockingQueue = new ArrayBlockingQueue(3); //...) public static void main(String[] args) throws InterruptedException { // 定义阻塞队列的长度为3...); System.out.println(blockingQueue.poll(1L,TimeUnit.SECONDS)); } SynchronousQueue 不存储元素的阻塞队列
LinkedBlockingQueue 上篇中,说到了ArrayBlockingQueue阻塞队列。在ArrayBlockingQueue中,底层使用了数组结构来实现。...LinkedBlockingQueue是一个使用链表实现的阻塞队列,支持多线程并发操作,可保证数据的一致性。...put(E e)是阻塞式插入,如果队列中的元素与链表长度相同,则此线程等待,直到有空余空间时,才执行。...,需要被唤醒进行消费 if (c == 0) //唤醒消费者线程: signalNotEmpty(); } offer(E e)是非阻塞式插入,队列中的元素与链表长度相同时...(); return x; } poll():非阻塞式出队,当队列中没有元素,则返回null.
正文 什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。...阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列有哪些?...DelayQueue:基于PriorityQueue,一种延时阻塞队列,DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。...DelayQueue也是一个无界队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。...offer(e,time,unit)设定等待的时间,如果在指定时间内还不能往队列中插入数据则返回false,插入成功返回true。
1 BlockingQueue 在此章节中,我们会对阻塞队列进行详细的介绍。 如果你对队列还不熟悉,可以先去看下以下几篇文章,或许对你的入门有所启发!...Java集合--Queue队列介绍 Java集合--Queue(Java中实现1) Java集合--Queue(Java中实现2) 在讲解ArrayBlockingQueue之前,我们先来介绍下它的父类...BlockingQueue BlockingQueue是一个接口,是所有阻塞队列的父类,定义了阻塞队列的主要操作方法。...:插入元素,如果队列满了,就直接返回false; 获取方法: element(继承父类):如果队列为空,直接抛出异常(底层调用peek方法); peek(继承父类):如果队列为空,则返回null; 移除方法...: remove:移除对应元素,如果队列为空,则返回false; take:移除元素,如果队列为空,则一直等待; poll:移除元素,如果队列为空,则返回null; BloeckingQueue成员
使用线程安全队列的场景有很多,Java在实现同步机制时,多线程对竞争资源进行操作时,同一时刻只能有一个线程可以操作,其他线程进行阻塞等待,这时,需要使用一种容器队列来装载等待的线程,在入队和出队时候保证线程的安全性...Java提供两种方式来实现阻塞式和非阻塞式,阻塞式使用锁实现,非阻塞式使用CAS方式实现。使用阻塞队列和非阻塞队列的场景还有很多,比较常用的就是我们常说的生产者\消费者模型。...阻塞队列 Java提供了一个阻塞队列的接口——BlockingQueue,在队列的基础上增加可阻塞添加元素和可阻塞获取元素的方法。 ? ?...DelayQueue是基于PriorityBlockingQueue实现的无界阻塞队列,队列元素需要实现了Delayed接口,所以,DelayQueue队列中的元素是按照延迟时间进行排序的,每次需要弹出将要到期的元素...BlockingDeque是接口定义,LinkedBlockingDeque是Java提供的唯一实现类,下面我们通过源码分析双端阻塞队列的实现算法。 ?
阻塞队列与普通队列的不同在于。当队列是空的时候,从队列中获取元素的操作将会被阻塞,或者当队列满时,往队列里面添加元素将会被阻塞。...试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。...同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列,下图展示了如何通过阻塞队列来合作: image.png...线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素 从5.0开始,JDK在Java.util.concurrent包里提供了阻塞队列的官方实现。...尽管JDK中已经包含了阻塞队列的官方实现。 阻塞队列的实现 阻塞队列的实现类似于带上限的Semaphore的实现。
而阻塞机制的实现是通过在入队和出队时加锁的方式避免并发操作。生产者线程,它会把生产出来的结果放到中间的阻塞队列中,而右侧的三个消费者也会从阻塞队列中取出它所需要的内容并进行处理。...因为阻塞队列是线程安全的,所以生产者和消费者都可以是多线程的,不会发生线程安全问题参考深入理解Java系列 | BlockingQueue用法详解深入理解Java系列 | Queue用法详解二、并发队列关系...Java 提供的线程安全的队列(也称为并发队列)分为阻塞队列和非阻塞队列两大类。...; /** * 将队列中的所有元素出队,并添加到给定的集合c中,返回出队的元素数量 */ int drainTo(Collection c); /** * 将队列中的元素出队,限制数量maxElements个,并添加到给定的集合c中,返回出队的元素数量 */ int drainTo(Collection
前言 上篇文章我们介绍了队列的基类接口Queue它定义了所有实现队列的类必须拥有的方法行为而BlockingQueue阻塞队列接口继承了Queue接口,此外BlockingQueue队列接口是Java并发包里面所有实现线程安全队列的基类接口...阻塞队列的设计主要的应用场景是生产者和消费者模式,此外由于基类接口也继承了java的Collection接口,所以它是支持在队列中移除任何的一个节点的,通过方法remove(x),但这里要注意由于链表结构的缺点...主要实现类分析 Java并发包里面实现BlockingQueue队列的的子类有如下7种: ArrayBlockingQueue, 一个基于数组实现有界阻塞队列 LinkedBlockingQueue,...(一)ArrayBlockingQueue介绍和实现原理分析 ArrayBlockingQueue是基于数组实现的有界的先进先出的阻塞队列,所以我们可以说队列的头部是队列中呆的时间最长的或者叫最早的,...队列来存储相关的数据,这个优先级队列底层使用的也是二叉堆构建的数组数据结构,其中在DelayQueue的泛型中限制了其类必须是继承了Delayed这个类本身或者子类,在插入的时候一个有序的二叉堆便已经生成
领取专属 10元无门槛券
手把手带您无忧上云