java队列,ArrayBlockingQueue
时间:2022-04-29
本文章向大家介绍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;
}
以上是几个常用的方法, 其他方法差别不大.
- 委托与事件
- 一款批量修改AE模板的工具
- 深入线程
- 【插件开发】—— 2 插件入门
- 线程间通讯:WaitHandler使用实例及分析
- 域名Deskbike.com刚注册没多久就以五位数结拍
- 一起Polyfill系列:Function.prototype.bind的四个阶段
- winform实现拼图游戏
- 一起Polyfill系列:让Date识别ISO 8601日期时间格式
- Oracle 监听器无法启动(TNS-12537,TNS-12560,TNS-00507)
- Javascript Prototypes之旅(A Plain English Guide to JavaScript Prototypes译文)
- Python补充03 Python内置函数清单
- 不懂JQuery的孩子:自封装Ajax函数
- .Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android编程简单解析JSON格式数据的方法示例
- Android控件BottomSheet实现底边弹出选择列表
- Android中CheckBox复选框控件使用方法详解
- Android Recyclerview实现水平分页GridView效果示例
- Android编程之ListView和EditText发布帖子隐藏软键盘功能详解
- 建造者模式_动力节点Java学院整理
- Android ScrollView嵌套横向滑动控件时冲突问题
- Android用户输入自动提示控件AutoCompleteTextView使用方法
- Android自定义View实现水波纹效果
- Android如何获取系统通知的开启状态详解
- Handler实现线程之间的通信下载文件动态更新进度条
- Android下Button实现图文混排效果
- android handler.post和handler.sendMessage的区别和联系
- 3小时带你开发一款商城类小程序(零基础入门小程序系列)
- Android 隐式Intent的实例详解