首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java并发编程:阻塞队列

Java并发编程:阻塞队列   在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList)...但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。...一.几种主要的阻塞队列   二.阻塞队列中的方法 VS 非阻塞队列中的方法   三.阻塞队列的实现原理   四.示例和使用场景   若有不正之处请多多谅解,并欢迎批评指正。   ...2.阻塞队列中的几个主要方法:   阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注意这5个方法在阻塞队列中都进行了同步措施。...在并发编程中,一般推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。

1K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    并发阻塞队列BlockingQueue解读

    并发阻塞队列BlockingQueue解读 引言 BlockingQueue 实现之 ArrayBlockingQueue 源码解读 构造函数 offer poll 循环队列 add remove put...是因为 BlockingQueue 支持当获取队列元素但是队列为空时,会阻塞等待队列中有元素再返回;也支持添加元素时,如果队列已满,那么等到队列可以放入新元素时再放入。...---- take take是阻塞获取,如果此时阻塞队列为空,当前线程需要阻塞在notEmpty条件关联的阻塞队列上: public E take() throws InterruptedException...while (count == 0) //如果此时阻塞队列为空,那么就将当前线程阻塞在notEmpty条件对象对应的阻塞队列上--释放当前线程占有的lock...,那么这段阻塞时间是否存在其他线程往阻塞队列添加元素呢?

    70320

    java并发队列阻塞队列-ArrayBlockingQueue

    前言 今天讲阻塞队列阻塞队列有很多,这篇文章只讲解ArrayBlockingQueue,其他的大同小异。...正文 什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。...阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列有哪些?...注意,此阻塞队列为无界阻塞队列,即容量没有上限(通过源码就可以知道,它没有容器满的信号标志),前面2种都是有界队列。...*/ int count; /* * 并发控制使用经典的两条件算法 *发现在任何教科书。

    92020

    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列...并行和并发区别 1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑; 2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B...,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费...,take方法在队列空的时候会阻塞,直到有队列成员被放进来。...take和put方法,这两个方法正是队列操作的阻塞版本。

    86120

    Java并发阻塞队列BlockingQueue概览

    一个线程往队列生产数据,另一个队列消耗数据 生产线程会持续生产新的实例放入队列中,直到队列容量达到指定值。也就是说,如果队列数据大小达到队列可以容纳的上限,那么生产线程会一致阻塞。...直到消费线程开始消耗队列中的数据。 消费线程会持续从队列获取数据,直到队列为空就会阻塞,直至有生产线程方数据到队列中。...Java BlockingQueue 的使用实例 我们使用 ArrayBlockingQueue 这个实现类来使用java中的阻塞队列。...这是为了演示让Consumer阻塞,直到等到Producer放入新值到队列中去。...它是一个 有界的、阻塞队列,数据元素通过一个内部数据存储。 有界 : 指的是不能存储无限的元素。它有一个上限,这应该在初始化时指定。

    31420

    Java并发阻塞队列之ArrayBlockingQueue

    JUC简介 在 Java 5.0 提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池,异步IO和轻量级任务框架...ArrayBlockingQueue简介 ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。线程安全是指类内部通过“互斥锁”保护竞争资源,实现多线程对竞争资源的互斥访问。...阻塞队列,是指多线程访问竞争资源时,当竞争资源已被某线程获取时,其它要获取该资源的线程需要阻塞等待; ArrayBlockingQueue是按FIFO(先进先出)原则对元素进行排序,元素都是从尾部插入到队列...void put(E e) // 返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的其他元素数量。...构造函数中this.items对应的代码为: /** The queued items */ final Object[] items; 这是存储阻塞队列数据的数组。

    39420

    Java并发编程之阻塞队列

    但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。...一.几种主要的阻塞队列   二.阻塞队列中的方法 VS 非阻塞队列中的方法   三.阻塞队列的实现原理   四.示例和使用场景 若有不正之处请多多谅解,并欢迎批评指正。...2.阻塞队列中的几个主要方法: 阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注意这5个方法在阻塞队列中都进行了同步措施。...null;否则返回取得的元素; 三.阻塞队列的实现原理 前面谈到了非阻塞队列阻塞队列中常用的方法,下面来探讨阻塞队列的实现原理,本文以ArrayBlockingQueue为例,其他阻塞队列实现原理可能和...在并发编程中,一般推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。

    42220

    并发队列-无界阻塞队列LinkedBlockingQueue原理探究

    一、前言 前面介绍了使用CAS实现的非阻塞队列ConcurrentLinkedQueue,下面就来介绍下使用独占锁实现的阻塞队列LinkedBlockingQueue的实现 二、 LinkedBlockingQueue...仔细思考下阻塞队列是如何实现并发安全的维护队列链表的,先分析下简单的情况就是当队列里面有多个元素时候,由于同时只有一个线程(通过独占锁putLock实现)入队元素并且是操作last节点(,而同时只有一个出队线程...(通过独占锁takeLock实现)操作head节点,所以不存在并发安全问题。...notEmpty.signal()去激活 notEmpty的条件队列里面的其他阻塞线程。...而ConcurrentLinkedQueue则使用CAS非阻塞算法来实现,使用CAS原子操作保证链表构建的安全性,当多个线程并发时候CAS失败的线程不会被阻塞,而是使用cpu资源去轮询CAS直到成功,size

    78130

    Java并发-22.阻塞队列

    阻塞队列(BlockingQueue)是一种支持两个附加操作的队列: 支持阻塞的插入:队列满时,队列阻塞插入元素的线程,直到队列不满 支持阻塞的溢出:队列空时,获取元素的线程等待队列变为非空 常见于生产者和消费者场景...阻塞队列不可用后,有四种处理方式: 处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put(e) offer(e, time,unit) 移除方法 remoe...超时退出 无界阻塞队列永远不满,put和offer方法永远不阻塞,offer永远返回true 1、 Java中的阻塞队列 Java中有7中阻塞队列: ArrayBlockingQueue:数组结构的有界阻塞队列...DelayQueue:使用优先级队列实现的无界阻塞队列 支持延时获取元素 用PriorityQueue实现 队列中元素必须实现Delay接口 创建对象时初始化基本数据 实现getDelay方法...,队列不可用,通过LockSupport.park(this)来阻塞生产者 调用setBlocker前先保存将要阻塞的线程,然后unsafe.park阻塞当前线程

    38120

    Java并发编程(六)阻塞队列

    1.什么是阻塞队列 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。...当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。 ? 那么支持以上两种阻塞场景的队列我们称之为阻塞队列。...而LinkedBlockingQueue之所以能够高效的处理并发数据,还因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,...以此来提高整个队列并发性能。...下面是使用阻塞队列实现的生产者-消费者模式: ? 很显然使用阻塞队列实现不需要单独考虑同步和线程间通信的问题,实现起来很简单。 参考资料: 《Java并发编程的艺术》

    835100

    Java并发——BlockingQueue阻塞队列(九)

    一、什么是阻塞队列(BlockingQueue) 阻塞队列,也就是 BlockingQueue,它是一个接口。BlockingQueue是基于阻塞机制实现的线程安全的队列。...而阻塞机制的实现是通过在入队和出队时加锁的方式避免并发操作。 生产者线程,它会把生产出来的结果放到中间的阻塞队列中,而右侧的三个消费者也会从阻塞队列中取出它所需要的内容并进行处理。...并发队列关系 Java 提供的线程安全的队列(也称为并发队列)分为阻塞队列和非阻塞队列两大类。...并发队列关系如下图: 三、阻塞队列的特点 先进先出 FIFO的数据结构(因为extends Queue)先进先出是Queue的能力 public interface BlockingQueue extends...,来实现线程安全,适合用在不需要阻塞功能,且并发不是特别剧烈的场景 源码分析 /** * Inserts the specified element at the tail of this

    16400

    并发队列-无界阻塞延迟队列DelayQueue原理探究

    一、前言 DelayQueue队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列。 二、 DelayQueue类图结构 ?...image.png 如图DelayQueue中内部使用的是PriorityQueue存放数据,使用ReentrantLock实现线程同步,可知是阻塞队列。...四、take操作 获取并移除队列首元素,如果队列没有过期元素则等待。...offer添加元素,也可以take阻塞自己),剩余过期时间到后,该线程会重新竞争得到锁,重新进入循环。...,那么这个队列就是一个重试队列,一个线程通过take方法获取需要重试的接口,take返回则接口进行重试,失败则再次放入队列,同时也可以在元素加上重试次数。

    91520

    并发队列-无界非阻塞队列ConcurrentLinkedQueue原理探究

    一、 前言 常用的并发队列阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞ConcurrentLinkedQueue是如何使用...,在并发环境下不是很有用,因为使用CAS没有加锁所以从调用size函数到返回结果期间有可能增删元素,导致统计的元素个数不精确。...SocketChannel socket = null; try { // 从TCP缓存获取一个完成三次握手的套接字,没有则阻塞...十二、总结 ConcurrentLinkedQueue使用CAS非阻塞算法实现使用CAS解决了当前节点与next节点之间的安全链接和对当前节点值的赋值。...由于使用CAS没有使用锁,所以获取size的时候有可能进行offer,poll或者remove操作,导致获取的元素个数不精确,所以在并发情况下size函数不是很有用。

    50010

    详解Java并发编程之阻塞队列

    前言 在Java并发编程中,阻塞队列(BlockingQueue)是一个非常有用的工具。它是一个线程安全的队列,支持生产者-消费者模式,可以解决多线程并发访问的问题。...阻塞队列的基本概念 阻塞队列是一种特殊的队列,它具有以下几个特点: (1)线程安全:阻塞队列是线程安全的,多个线程可以并发访问它而不会发生冲突。...阻塞队列的使用场景 阻塞队列在Java并发编程中有着广泛的应用场景,主要包括以下几个: (1)线程池:Java中的线程池使用了阻塞队列来管理任务队列,当线程池中的线程数达到最大值时,新的任务会被放入阻塞队列中等待执行...总结 阻塞队列是Java并发编程中非常重要的一个工具类,它可以实现多线程之间的协作,提高程序的效率和可靠性。在使用阻塞队列时需要注意以下几点: 1....综上所述,阻塞队列是Java并发编程中非常重要的一个工具类,可以实现多线程之间的协作,提高程序的效率和可靠性。

    38120

    阻塞队列与非阻塞队列

    Java提供很多线程安全的容器,为开发人员在并发编程场景下使用,通常我们会更加关注业务实现,而不关心底层结构。...Java提供两种方式来实现阻塞式和非阻塞式,阻塞式使用锁实现,非阻塞式使用CAS方式实现。使用阻塞队列和非阻塞队列的场景还有很多,比较常用的就是我们常说的生产者\消费者模型。...阻塞队列 Java提供了一个阻塞队列的接口——BlockingQueue,在队列的基础上增加可阻塞添加元素和可阻塞获取元素的方法。 ? ?...阻塞队列是一种线程安全的队列,支持在并发环境下对队列的入队和出队操作,适用于生产者与消费者模式,入队线程就是生产者,出队线程就是消费者。...---- 《Java并发编程的艺术》 《Java并发编程实战》 http://www.cnblogs.com/chenyangyao/p/5269622.html http://www.cnblogs.com

    3.1K30

    并发包入坑指北』之阻塞队列

    之前或多或少也分享过相关内容,但都不成体系;于是便想整理一套与并发包相关的系列文章。 其中的内容主要包含以下几个部分: 根据定义自己实现一个并发工具。 JDK 的标准实现。 实践案例。...自己实现 在自己实现之前先搞清楚阻塞队列的几个特点: 基本队列特性:先进先出。 写入队列空间不可用时会阻塞。 获取队列数据时当队列为空时将阻塞。...消费队列 上文也提到了:当队列为空时,获取队列的线程需要被阻塞,直到队列中有数据时才被唤醒。...---- 而当没有消费时,再往队列里写数据则会导致写入线程被阻塞并发测试 三个线程并发写入300条数据,其中一个线程消费一条。 =====0299 最终的队列大小为 299,可见线程也是安全的。...总结 关于 ArrayBlockingQueue 的相关分享便到此结束,接着会继续更新其他并发容器及并发工具。

    29320

    Java并发编程学习7-阻塞队列

    引言介绍阻塞队列之前,先来介绍下队列 Queue。Queue 用来临时保存一组等待处理的元素。它提供了几种非阻塞队列实现,如下:ConcurrentLinkedQueue,这是一个传统的先进先出队列。...PriorityQueue,这是一个(非并发的)优先队列。如上两个队列的操作不会阻塞,如果队列为空,那么获取元素的操作将返回空值。...如果队列已经满了,那么 put 方法将阻塞直到有空间可用;如果队列为空,那么 take 方法将会阻塞直到有元素可用。...队列可以是有界的也可以是无界的,无界队列永远都不会充满,因此无界队列上的 put 方法也永远不会阻塞阻塞队列支持 生产者--消费者 这种设计模式。...和 ArrayList 类似,但比同步 List 拥有更好的并发性能。

    13821
    领券