Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList)...本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法,接着分析了阻塞队列的实现原理,最后给出了一个实际例子和几个使用场景。 ...请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3932906.html 一.几种主要的阻塞队列 自从Java 1.5之后,...在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小...在并发编程中,一般推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。
JUC简介 在 Java 5.0 提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池,异步IO和轻量级任务框架...阻塞队列,是指多线程访问竞争资源时,当竞争资源已被某线程获取时,其它要获取该资源的线程需要阻塞等待; ArrayBlockingQueue是按FIFO(先进先出)原则对元素进行排序,元素都是从尾部插入到队列...void put(E e) // 返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的其他元素数量。...构造函数中this.items对应的代码为: /** The queued items */ final Object[] items; 这是存储阻塞队列数据的数组。...package com.secbro2.juc; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; /*
BlockingQueue java.util.concurrent包下的 BlockingQueue 接口规范了一个放数据、取数据都是线程安全的队列。...也就是说,如果队列数据大小达到队列可以容纳的上限,那么生产线程会一致阻塞。直到消费线程开始消耗队列中的数据。 消费线程会持续从队列获取数据,直到队列为空就会阻塞,直至有生产线程方数据到队列中。...: 如果指定的操作不能马上执行,则会一直阻塞 超时: 如果指定的操作不能马上执行,则会阻塞直到给定的时间单位,最后返回一个表示操作是否成功执行的标志(一般是true / false) 不允许往...SynchronousQueue 这几个类的使用我们在后面节中讨论,你也可以先通过查看JAVA DOC先了解使用。...Java BlockingQueue 的使用实例 我们使用 ArrayBlockingQueue 这个实现类来使用java中的阻塞队列。
但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。...本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法,接着分析了阻塞队列的实现原理,最后给出了一个实际例子和几个使用场景。 ...一.几种主要的阻塞队列 自从Java 1.5之后,在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列,...类中的几个成员变量: public class ArrayBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable...在并发编程中,一般推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。
阻塞队列(BlockingQueue)是一种支持两个附加操作的队列: 支持阻塞的插入:队列满时,队列阻塞插入元素的线程,直到队列不满 支持阻塞的溢出:队列空时,获取元素的线程等待队列变为非空 常见于生产者和消费者场景...阻塞队列不可用后,有四种处理方式: 处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put(e) offer(e, time,unit) 移除方法 remoe...超时退出 无界阻塞队列永远不满,put和offer方法永远不阻塞,offer永远返回true 1、 Java中的阻塞队列 Java中有7中阻塞队列: ArrayBlockingQueue:数组结构的有界阻塞队列...,返回元素还需要延长多长时间,单位纳秒 实现compareTo方法指定元素顺序 创建元素时可以指定多久才能获取当前元素 元素没有达到延时时间就阻塞当前线程 SynchronousQueue:不存储元素的阻塞队列...调用setBlocker前先保存将要阻塞的线程,然后unsafe.park阻塞当前线程
2.Java中的阻塞队列 JDK7提供了7个阻塞队列,分别是: ArrayBlockingQueue :由数组结构组成的有界阻塞队列。...默认情况下不保证访问者公平的访问队列,所谓公平访问队列是指阻塞的所有生产者线程或消费者线程,当队列可用时,可以按照阻塞的先后顺序访问队列,即先阻塞的生产者线程,可以先往队列里插入元素,先阻塞的消费者线程...而LinkedBlockingQueue之所以能够高效的处理并发数据,还因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,...以此来提高整个队列的并发性能。...下面是使用阻塞队列实现的生产者-消费者模式: ? 很显然使用阻塞队列实现不需要单独考虑同步和线程间通信的问题,实现起来很简单。 参考资料: 《Java并发编程的艺术》
而阻塞机制的实现是通过在入队和出队时加锁的方式避免并发操作。 生产者线程,它会把生产出来的结果放到中间的阻塞队列中,而右侧的三个消费者也会从阻塞队列中取出它所需要的内容并进行处理。...因为阻塞队列是线程安全的,所以生产者和消费者都可以是多线程的,不会发生线程安全问题 参考 深入理解Java系列 | BlockingQueue用法详解 深入理解Java系列 | Queue用法详解 二、...并发队列关系 Java 提供的线程安全的队列(也称为并发队列)分为阻塞队列和非阻塞队列两大类。...并发队列关系如下图: 三、阻塞队列的特点 先进先出 FIFO的数据结构(因为extends Queue)先进先出是Queue的能力 public interface BlockingQueue extends...,来实现线程安全,适合用在不需要阻塞功能,且并发不是特别剧烈的场景 源码分析 /** * Inserts the specified element at the tail of this
前言 在Java并发编程中,阻塞队列(BlockingQueue)是一个非常有用的工具。它是一个线程安全的队列,支持生产者-消费者模式,可以解决多线程并发访问的问题。...阻塞队列的基本概念 阻塞队列是一种特殊的队列,它具有以下几个特点: (1)线程安全:阻塞队列是线程安全的,多个线程可以并发访问它而不会发生冲突。...阻塞队列的使用场景 阻塞队列在Java并发编程中有着广泛的应用场景,主要包括以下几个: (1)线程池:Java中的线程池使用了阻塞队列来管理任务队列,当线程池中的线程数达到最大值时,新的任务会被放入阻塞队列中等待执行...总结 阻塞队列是Java并发编程中非常重要的一个工具类,它可以实现多线程之间的协作,提高程序的效率和可靠性。在使用阻塞队列时需要注意以下几点: 1....综上所述,阻塞队列是Java并发编程中非常重要的一个工具类,可以实现多线程之间的协作,提高程序的效率和可靠性。
前言 今天讲阻塞队列,阻塞队列有很多,这篇文章只讲解ArrayBlockingQueue,其他的大同小异。...类中的几个成员变量: public class ArrayBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable.../** 下一个put、.或add的项目索引 */ int putIndex; /** 队列中的元素数量 */ int count; /* * 并发控制使用经典的两条件算法...version v1.3 * @date 2018-12-22 1:28 PM * @since v8.0 **/ import org.testng.annotations.Test; import java.util.concurrent...InterruptedException { abq.put(i); System.out.println("存入了一个元素是 " + i); } } 下面看输出,很明显多线程也没有发生并发问题
PriorityQueue,这是一个(非并发的)优先队列。如上两个队列的操作不会阻塞,如果队列为空,那么获取元素的操作将返回空值。...和 ArrayList 类似,但比同步 List 拥有更好的并发性能。...串行线程封闭在 java.util.concurrent 中实现的各种阻塞队列都包含了足够的内部同步机制,从而安全地将对象从生产者线程发布到消费者线程。...对象池利用了串行线程封闭,将对象“借给”一个请求线程。...最常使用中断的情况就是取消某个操作,如果程序对中断请求的响应度越高,就越容易及时取消那些执行时间很长的操作。
上次我们讲了一些常用的4个阻塞队列,但是在JDK中还提供了其他的一些阻塞队列。这篇文章将全面介绍一下JDK中的所有阻塞队列,并比较他们的区别。 JDK7提供了7个阻塞队列。...分别是 ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。 ...PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。 DelayQueue:一个使用优先级队列实现的无界阻塞队列。 ...SynchronousQueue:一个不存储元素的阻塞队列。 LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。 ...参考资料: http://www.infoq.com/cn/articles/java-blocking-queue/
阻塞队列在并发编程非常常用,被广泛使用在“生产者-消费者”问题中。接下来两篇文章就来详细介绍阻塞队列。本文是阻塞队列上篇。...,往阻塞队列插入数据的线程会被阻塞,直至阻塞队列已经有空余的容量可供使用; offer(E e, long timeout, TimeUnit unit):若阻塞队列已经满时,同样会阻塞插入数据的线程,...源码: public class ArrayBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable... implements BlockingQueue, java.io.Serializable { final Object[] items;// 用于存放元素的数组...LinkedBlockingQueue的读写分别用不同的锁来保证数据安全,采用不同的锁可以使读线程和写线程并发执行,提高了吞吐量,但也增加了编程的复杂度。
上一篇 并发编程4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文章来了解剩下的四种阻塞队列...7 种阻塞队列的特点 这篇文章介绍的 4 种加上上一篇 细说并发4:Java 阻塞队列源码分析(上) 中 3 种,总共 7 种阻塞队列,这么多队列看的眼都花了。...: 基于链表、有界阻塞队列 添加和获取是两个不同的锁,所以并发添加/获取效率更高些 Executors.newFixedThreadPool() 使用了这个队列 PriorityBlockingQueue...我们结合源码和《Java 并发编程的艺术》相关章节分两篇文章介绍了 Java 中的阻塞队列,了解了 7 种阻塞队列的大致源码实现,后面遇到需要使用阻塞队列时心里应该有些底了。...Thanks 《Java 并发编程的艺术》 http://blog.csdn.net/goldlevi/article/details/7705180 http://stevex.blog.51cto.com
上篇文章 并发编程3:线程池的使用与执行流程 中我们了解到,线程池中需要使用阻塞队列来保存待执行的任务。这篇文章我们来详细了解下 Java 中的阻塞队列究竟是什么。...具体到 Java 中,使用 BlockingQueue 接口表示阻塞队列: public interface BlockingQueue extends Queue { //添加失败时会抛出异常...七种阻塞队列的前三种 Java 中提供了 7 种 BlockingQueue 的实现,在看线程池之前我根本搞不清楚究竟选择哪个,直到完整地对比总结以后,发现其实也没什么复杂。...,这样在添加、获取时通过判断数组元素个数可以感知到并发的获取/添加操作 ;此外就是链表比数组的优势了。...不了解 Comparator 和 Comparable 可以看这篇 Java 解惑:Comparable 和 Comparator 的区别。
但是当多线程的情况下,某个特定时间下,(峰值高并发)出现消费者速度远大于生产者速度,消费者必须阻塞来等待生产者,以保证生产者能够生产出新的数据;当生产者速度远大于消费者速度时,同样也是一个道理。...arrayObject中 继续 arrayOfObject[this.putIndex] = paramE;将put方法传入的参数赋值到arrayOfObject中,这里其实是items也改变了,因为java...LinkedBlockingQueue之所以能够高效的处理并发数据,是因为take()方法和put(E param)方法使用了不同的可重入锁,分别为private final ReentrantLock...putLock和private final ReentrantLock takeLock,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能。...参考资料: 《Java编程思想》 http://www.cnblogs.com/studyLog-share/p/5390745.html http://www.cnblogs.com/dolphin0520
Java并发编程系列32 | 阻塞队列(下) 阻塞队列在并发编程非常常用,被广泛使用在“生产者-消费者”问题中。本文是阻塞队列下篇。...后执行的item time=2019-12-31T12:18:27.306 类结构 DelayQueue使用优先级队列PriorityQueue存储元素;使用ReentrantLock锁,保证队列数据并发环境下的安全性...;通过lock的Condition实现阻塞。...BlockingQueue { /** 优先级队列,保存元素 */ private final PriorityQueue q = new PriorityQueue(); /** 锁,保证队列数据并发环境下的安全性...LinkedBlockingQueue的读写分别用不同的锁来保证数据安全,采用不同的锁可以使读线程和写线程并发执行,提高了吞吐量,但也增加了编程的复杂度。
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题。如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节。...Java为我们提供了多种API来对线程进行阻塞和唤醒操作,比如suspend与resume、sleep、wait与notify以及park与unpark等等。...睡眠 控制线程阻塞与唤醒的最简单方式就是sleep了,Java通过sleep(n)方法能让线程进入到阻塞等待状态,直到休眠时间达到指定值后自动唤醒。...该方法简单也常用,但这种方式比较死板,需要我们预先确定线程进入阻塞的时间。而有些场景实际上我们根本没办法确定睡眠时间,这是sleep方式的最大劣势。 sleep的使用很简单,下面为一个例子。...挂起与恢复 在Java发展史上曾经使用suspend()、resume()方法对于线程进行阻塞唤醒,它能够在代码中控制阻塞和唤醒的时间节点,比起sleep()方法更加灵活。
如果架子放满了,没有人来买,师傅就会停下来,等有人来买了,才会继续做,这就是所谓的队列阻塞,而能产生阻塞行为的队列称为阻塞队列。...DelayQueue:使用优先级队列实现的无界阻塞队列。 SynchronousQueue:不存储元素的阻塞队列。 LinkedTransferQueue:链表结构组成的无界阻塞队列。...下面是一个基本示例: 模拟了买油条的场景,1个老板在做油条,3个顾客在排队买 package yjmyzz.test; import java.util.concurrent.ArrayBlockingQueue...然后12-13行,终于来了一个客户B买了一根,然后老板又要开始做(14-15行),发现架子上放满了,不得不停下,等C再买一根(16-17行),才能继续做(18行) 实现原理: 聊聊并发(七)——Java...参考文章: http://ifeve.com/java-blocking-queue/ http://www.cnblogs.com/dolphin0520/p/3932906.html
阻塞队列是Java并发编程中的一个重要概念。它可以允许多个线程同时进行读写操作,且在队列为空或队列已满时可以自动阻塞或唤醒线程,有效解决了多线程并发访问共享资源的问题。...以Java内置的BlockingQueue为例,下面对这些实现方式进行介绍。...Lock 和 Condition 类 Lock 和 Condition 类也是Java并发编程提供的新特性。...Java中通过ReentrantLock类来实现锁的控制和管理。它可以比 synchronized 更细粒度地控制多线程并发访问共享资源。...3、总结 阻塞队列是Java并发编程中常见的实现方式之一。它解决了线程同步和线程间通信的问题,能够有效地提高应用程序的性能和并发性。
领取专属 10元无门槛券
手把手带您无忧上云