博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java队列,ArrayBlockingQueue
阅读量:5975 次
发布时间:2019-06-19

本文共 1723 字,大约阅读时间需要 5 分钟。

hot3.png

提供了三个构造方法:

   ①.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.
cast(items[takeIndex]);//获取一个强转对象 items[takeIndex] = null;/清除容器中这个元素 takeIndex = inc(takeIndex);//下一个可取的位置 --count; notFull.signal();//唤醒生产线程 return x; }

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

 

转载于:https://my.oschina.net/u/2486137/blog/1570429

你可能感兴趣的文章
交互设计[3]--点石成金
查看>>
SCCM TP4部署Office2013
查看>>
redis主从配置<转>
查看>>
bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
查看>>
利用console控制台调试php代码
查看>>
递归算法,如何把list中父子类对象递归成树
查看>>
讲解sed用法入门帖子
查看>>
Linux 内核已支持苹果
查看>>
shell脚本逻辑判断,文件目录属性判断,if,case用法
查看>>
【二叉树系列】二叉树课程大作业
查看>>
App重新启动
查看>>
矩阵乘法
查看>>
得到目标元素距离视口的距离以及元素自身的宽度与高度(用于浮层位置的动态改变)...
查看>>
安装和配置Tomcat
查看>>
实验三
查看>>
openssh for windows
查看>>
PostgreSQL cheatSheet
查看>>
ASP.NET Core 2 学习笔记(三)中间件
查看>>
转:Mosquitto用户认证配置
查看>>
SpringBoot上传文件到本服务器 目录与jar包同级
查看>>