JUC——阻塞队列

本文介绍了Java并发包中的BlockingQueue,它用于高效安全地在多线程间共享数据。 BlockingQueue提供了线程安全的队列操作,当队列为空时,获取元素的线程会被阻塞,直到其他线程添加元素;当队列满时,添加元素的线程会被阻塞,直至队列有空位。文章讨论了ArrayBlockingQueue和LinkedBlockingQueue这两种常用的阻塞队列,分析了它们的特性和使用场景,并总结了 BlockingQueue的核心方法及其在多线程编程中的重要性。
摘要由CSDN通过智能技术生成

什么是阻塞队列

Concurrent 包中,BlockingQueue 很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了 BlockingQueue 家庭中的所有成员,包括他们各自的功能以及常见使用场景。阻塞队列,顾名思义,首先它是一个队列, 通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出;
在这里插入图片描述

  • 当队列是空的,从队列中获取元素的操作将会被阻塞
  • 当队列是满的,从队列中添加元素的操作将会被阻塞
  • 试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素
  • 试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增。
    常用的队列主要有以下两种:
    • 先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。
    从某种程度上来说这种队列也体现了一种公平性
    • 后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发
    生的事件(栈)
    在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤起。

为什么需要 BlockingQueue?

  • 好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切
    BlockingQueue 都给你一手包办了。
  • 在 concurrent 包发布以前,在多线程环境下,我们每个程序员都必须去自己控制这些细
    节,尤其还要兼顾效率和线程安全,而这会给我们的程序带来不小的复杂度。
  • 多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和 “消费者”模型中,通过队列可以很便利地实现两者之间的数据共享。假设我们有若干生产者线程,另外又有若干个消费者线程。如果生产者线程需要把准备好的数据共享给消费者线程,利用队列的方式来传递数据,就可以很方便地解决他们之间的数据共享问题。但如果生产者和消费者在某个时间段内,万一发生数据处理速度不匹配的情况呢?理想情况下,如果生产者产出数据的速度大于消费者消费的速度,并且当生产出来的数据累积到一定程度的时候,那么
    生产者必须暂停等待一下(阻塞生产者线程),以便等待消费者线程把累积的数据处理完毕,反之亦然。
    • 当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),
    直到有数据放入队列
    • 当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),
    直到队列中有空的位置,线程被自动唤醒

BlockingQueue 核心方法

在这里插入图片描述
1.放入数据
• offer(anObject):表示如果可能的话,将 anObject 加到 BlockingQueue 里,即
如果 BlockingQueue 可以容纳,则返回 true,否则返回 false.(本方法不阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值