前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java队列,ArrayBlockingQueue

java队列,ArrayBlockingQueue

作者头像
用户1215919
发布2018-02-27 10:28:06
5500
发布2018-02-27 10:28:06
举报
文章被收录于专栏:大大的微笑大大的微笑

提供了三个构造方法:    ①.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;//判断是否已满,满则阻塞

方法:

代码语言:javascript
复制
 /**添加**/
 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;
    }

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档