java.util.concurrent.ArrayBlockingQueue
来源:互联网 发布:房地产行业 黑心 知乎 编辑:程序博客网 时间:2024/05/22 15:38
ArrayBlockingQueue
使用示例:
ArrayBlockingQueue<String> aq = new ArrayBlockingQueue<String>(5);aq.add("xx3");try {aq.put("cc");} catch (InterruptedException e) {e.printStackTrace();}aq.offer("xx");try {aq.take();} catch (InterruptedException e) {e.printStackTrace();}aq.poll();
ArrayBlockingQueue是一个基于数组、先进先出、线程安全的集合类,其特点是实现指定时间的阻塞读写,并且容量是可以限制的。
1)创建
初始化锁和两个锁上的Condition,一个为notEmpty,一个为notFull。
2)添加
offer(E e , long timeout , TimeUtil unit)
这个方法将元素插入数组的末尾,如果数组满,则进入等待,只到以下三种情况发生才继续:
被唤醒、达到指定的时间、当前线程被中断。
该方法首先将等待时间转换成纳秒。然后加锁,如果数组未满,则在末尾插入数据,如果数组已满,则调用notFull.awaitNanos进行等待。如果被唤醒或超时,重新判断是否满。如果线程被interrupt,则直接抛出异常。
另外一个不带时间的offer方法在数组满的情况下不进去等待,而是直接返回false。
同时还可以选择put方法,此方法在数组已满的情况下会一直等待,知道数组不为空或线程被interrupt。
3)获取
poll(long timeout, TimeUnit unit)
poll获取队列中的第一个元素,如果队列中没有元素,则进入等待。
poll首先将制定timeout转换成纳秒,然后加锁,如果数组个数不为0,则从当前对象数组中获取最后一个元素,在获取后将位置上的元素置为null。
如果数组中的元素个数为0,首先判断timeout是否小于等于0,若小于0则直接返回null。若大于则进行等待,如果被唤醒或者超时,重新判断数据元素个数是否大于0。
如果线程被interrupt,则直接抛出InterruptedException。
和offer一样,不带时间的poll方法在数组元素个数为0直接返回null,不进行等待。
take方法在数据为空的情况下会一直等待,只到数组不为空或者interrupt。
应用场景在哪呢?
- java.util.concurrent.ArrayBlockingQueue
- java.util.concurrent.ArrayBlockingQueue
- java.util.concurrent.ArrayBlockingQueue
- java.util.concurrent.BlockingQueue ArrayBlockingQueue
- Java多线程工具包java.util.concurrent---ArrayBlockingQueue
- (译)Java Concurrent系列--ArrayBlockingQueue
- 【java】 java.util.concurrent
- java.util.concurrent.CyclicBarrier
- java.util.concurrent 学习
- java.util.concurrent包
- java.util.concurrent 架构
- java.util.concurrent
- 关于 java.util.concurrent
- java.util.concurrent.ThreadPoolExecutor
- java.util.concurrent介绍
- java.util.concurrent介绍
- java.util.concurrent介绍
- java.util.concurrent介绍
- 程序员的平衡点
- handelc中慎用signal类型变量
- 调用约定
- 图片跳动显示对应图片
- 百度地图无法正常画线的问题
- java.util.concurrent.ArrayBlockingQueue
- <数据结构>线性表
- UVaOJ839---Not so Mobile
- [Point Cloud Library] 基本结构 PointCloud
- P11.Image separation
- 在共享DLL中使用MFC 和在静态库中使用MFC的区别
- android--BroadCastReceiver 简介
- svn中导出来的项目运行出错
- php遍历目录下的文件夹