专栏首页大大的微笑java队列,ArrayBlockingQueue

java队列,ArrayBlockingQueue

提供了三个构造方法:    ①.ArrayBlockingQueue(int capacity)//指定长度,默认加锁机制为非公平锁    ②.ArrayBlockingQueue(int capacity, boolean fair)//显示指定使用公平锁或非公平锁    ③.ArrayBlockingQueue(int capacity, boolean fair,Collection<? extends E> c) //可以传入一个集合 全局变量:  final Object[] items;//queue维护了一个定长数组用来当对象容器,在初始化时创建  int takeIndex;  int putIndex;  int count;//容器的大小  final ReentrantLock lock;//显示锁  private final Condition notEmpty;//用来做线程通信,若队列已空则阻塞  private final Condition notFull;//判断是否已满,满则阻塞

方法:

 /**添加**/
 public void put(E e) throws InterruptedException {
        checkNotNull(e);//非空检查,若为空抛异常
        final ReentrantLock lock = this.lock;//加锁
        lock.lockInterruptibly();
        try {
            while (count == items.length)
                notFull.await();//队列满了阻塞.
            insert(e);//否则添加
        } finally {
            lock.unlock();
        }
    }

private void insert(E x) {
        items[putIndex] = x;
        putIndex = inc(putIndex);
        ++count;
        notEmpty.signal();//唤醒消费线程
    }


 final int inc(int i) {//返回下一个该添加的位置,若满则从0开始
        return (++i == items.length) ? 0 : i;
    }


 /**取**/
 public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            while (count == 0)
                notEmpty.await();//没有可消费对象阻塞
            return extract();//获取
        } finally {
            lock.unlock();
        }
    }

private E extract() {
        final Object[] items = this.items;
        E x = this.<E>cast(items[takeIndex]);//获取一个强转对象
        items[takeIndex] = null;/清除容器中这个元素
        takeIndex = inc(takeIndex);//下一个可取的位置
        --count;
        notFull.signal();//唤醒生产线程
        return x;
    }

以上是几个常用的方法, 其他方法差别不大.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Cloud netflix ribbon源码分析

    用户1215919
  • 观察者模式详解

    观察者模式是众多软件设计模式中的一种,又称发布订阅模式.被观察的对象发生了变化,观察者对象们可以第一时间收到通知, 并作出相应的处理,例如作为一家餐馆的会员...

    用户1215919
  • Future,带返回执行结果的线程使用方式

    FutureTask是Future的一种实现方式. private final int count; public Counter(int count) {...

    用户1215919
  • 数字出现的次数

    葆宁
  • 吃糖果(鸽笼原理) - HDU 1205

    鸽笼原理(也称抽屉原理) 简单的表述如下,这个原理看起来非常通俗,好像是在说一句废话一样,然而数学就是这样,总是需要证明一下。

    ACM算法日常
  • LeetCode 424. 替换后的最长重复字符(滑动窗口)

    给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。 在执行上述操作后,找到只包含重复字母的最长子串的长度...

    Michael阿明
  • 【leetcode刷题】T190-阶乘后的零

    https://leetcode-cn.com/problems/factorial-trailing-zeroes

    木又AI帮
  • PHP 获取百度和搜狗收录量 代码 可用于EMLOG

    Youngxj
  • LeetCode 1093. 大样本统计

    我们对 0 到 255 之间的整数进行采样,并将结果存储在数组 count 中:count[k] 就是整数 k 的采样个数。

    Michael阿明
  • ext3支持的单个文件大小

    block size=1024时,单个文件最大支持16GB block size=4096时,单个文件最大支持4TB (官方说是2TB)

    py3study

扫码关注云+社区

领取腾讯云代金券