juc 阻塞队列被问怕了,熬夜总结

本文详细解析了JUC包下的阻塞队列,包括BlockingQueue接口的11个核心方法及其阻塞机制,并介绍了ArrayBlockingQueue、LinkedBlockingQueue等常用实现类。

juc 指的是 jdk 下的 java.util.concurrent包,在这个包下提供了很多并发相关的工具类。本文将解析这个包下面的一些阻塞队列。

阻塞队列其实是实现了java.util.concurrent.BlockingQueue接口的一些实现类,要搞明白阻塞队列,那么就要清楚这个接口到底是做什么的。

public interface BlockingQueue<E> extends Queue<E> {
    boolean add(E e);
    boolean offer(E e);
    void put(E e) throws InterruptedException;
    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;
    E take() throws InterruptedException;
    E poll(long timeout, TimeUnit unit)
        throws InterruptedException;
    int remainingCapacity();
    boolean remove(Object o);
    public boolean contains(Object o);
    int drainTo(Collection<? super E> c);
    int drainTo(Collection<? super E> c, int maxElements);
}

总共有11个方法,根据注释可以了解到这些方法的意图。

1. add(E e)。在容量允许的情况下,添加元素到队列中,添加成功则返回 true,否则抛出异常。如果队列是有界的,那么推荐使用 offer 方法。
2. offer(E e)。添加元素到队列中,成功返 true,失败返回 false。
3. put(E e)。添加指定元素到队列中,该方法会一直等待直到队列中有可用空间为止。
4. offer(E e, long timeout, TimeUnit unit)。添加指定元素到队列中,该方法会等待一定时间,如果这段时间内添加成功,则返回true,否则返回false。
5. take()。从队列头部获取元素并移除,如果队列中没有数据则会一直阻塞,直到有数据为止。
6. poll(long timeout, TimeUnit unit)。从队列头部获取数据并移除,该方法会阻塞一定的时间,如果在这段时间内没有获取到数据,那么抛出 InterruptedException 异常。
7. remainingCapacity()。返回队列剩余的可用空间。
8. remove(Object o)。从队列中移除一个指定的元素,如果存在则返回 true,不存在则返回 false。
9. contains(Object o)。如果队列中包含指定的元素,那么返回 true,否则返回 false。
10. drainTo(Collection<? super E> c)。转移队列中的所有元素到另一个集合当中。
11. drainTo(Collection<? super E> c, int maxElements)。转移队列中的指定最大量元素到另一个集合当中,返回实际移除的元素数量。

BlockingQueue 常用的实现类如下:

实现类解析原文链接
ArrayBlockingQueue查看详解
LinkedBlockingQueue查看详解
PriorityBlockingQueue查看详解
DelayQueue查看详解
SynchronousQueue查看详解
LinkedTransferQueue查看详解
LinkedBlockingDeque查看详解

我的一些理解:

  1. 阻塞队列是阻塞的,但是阻塞的情况分两种,一种是在获取锁的情况下会阻塞,另一个中是具体添加元素或者获取元素时,不满足一些条件(队列不为空或者队列未满),此时会通过一些方式进行阻塞。
代码下载地址: https://pan.quark.cn/s/bc087ffa872a "测控电路课后习题详解"文件.pdf是一份极具价值的学术资料,其中系统地阐述了测控电路的基础理论、系统构造、核心特性及其实际应用领域。 以下是对该文献的深入解读和系统梳理:1.1测控电路在测控系统中的核心功能测控电路在测控系统的整体架构中扮演着不可或缺的角色。 它承担着对传感器输出信号进行放大、滤除杂音、提取有效信息等关键任务,并且依据测量与控制的需求,执行必要的计算、处理与变换操作,最终输出能够驱动执行机构运作的指令信号。 测控电路作为测控系统中最具可塑性的部分,具备易于放大信号、转换模式、传输数据以及适应多样化应用场景的优势。 1.2决定测控电路精确度的关键要素影响测控电路精确度的核心要素包括:(1)噪声与干扰的存在;(2)失调现象与漂移效应,尤其是温度引起的漂移;(3)线性表现与保真度水平;(4)输入输出阻抗的特性影响。 在这些要素中,噪声干扰与失调漂移(含温度效应)是最为关键的因素,需要给予高度关注。 1.3测控电路的适应性表现测控电路在测控系统中展现出高度的适应性,具体表现在:* 具备选择特定信号、灵活实施各类转换以及进行信号处理与运算的能力* 实现模数转换与数模转换功能* 在直流与交流、电压与电流信号之间进行灵活转换* 在幅值、相位、频率与脉宽信号等不同参数间进行转换* 实现量程调整功能* 对信号实施多样化的处理与运算,如计算平均值、差值、峰值、绝对值,进行求导数、积分运算等,以及实现非线性环节的线性化处理、逻辑判断等操作1.4测量电路输入信号类型对电路结构设计的影响测量电路的输入信号类型对其电路结构设计产生显著影响。 依据传感器的类型差异,输入信号的形态也呈现多样性。 主要可分为...
JUC 里的 `ReentrantLock` 使用了阻塞队列。`ReentrantLock` 本身没有代码逻辑,实现都在其内部类 `Sync` 中,而 `Sync` 继承自 `AbstractQueuedSynchronizer`(AQS)。AQS 内部维护了一个 FIFO(先进先出)的双向队列,用于管理竞争锁的线程。 当多个线程竞争 `ReentrantLock` 时,未获取到锁的线程会被封装成 `Node` 节点加入到这个队列中,线程会被阻塞。当持有锁的线程释放锁后,AQS 会从队列的头部唤醒等待时间最长的线程,使其有机会获取锁,这体现了公平锁机制,也就是在锁上等待时间最长的线程将获得锁的使用权,通俗理解就是谁排队时间最长谁先执行获取锁 [^2]。 以下是一个简单的使用 `ReentrantLock` 的示例代码: ```java import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockExample { private final ReentrantLock lock = new ReentrantLock(); public void performTask() { lock.lock(); try { // 执行需要同步的任务 System.out.println(Thread.currentThread().getName() + " 获得了锁,正在执行任务"); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); System.out.println(Thread.currentThread().getName() + " 释放了锁"); } } public static void main(String[] args) { ReentrantLockExample example = new ReentrantLockExample(); Thread thread1 = new Thread(example::performTask, "Thread-1"); Thread thread2 = new Thread(example::performTask, "Thread-2"); thread1.start(); thread2.start(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值