可阻塞的队列——ArrayBlockingQueue
来源:互联网 发布:申请域名注册商 编辑:程序博客网 时间:2024/04/29 03:58
阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量。
ArrayBlockingQueue
只有put方法和take方法才具有阻塞功能
api说明:
public class ArrayBlockingQueue<E>
- extends AbstractQueue<E>
- implements BlockingQueue<E>, Serializable
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。
这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。
此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。
例子:
package com.study.communication;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;/** * * @author 我夕 * */public class BlockingQueueTest {public static void main(String[] args) {final BlockingQueue queue = new ArrayBlockingQueue(3);for(int i=0;i<2;i++){new Thread(){public void run(){while(true){try {Thread.sleep((long)(Math.random()*1000));System.out.println(Thread.currentThread().getName() + "准备放数据!");queue.put(1);System.out.println(Thread.currentThread().getName() + "已经放了数据," + "队列目前有" + queue.size() + "个数据");} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}new Thread(){public void run(){while(true){try {//将此处的睡眠时间分别改为100和1000,观察运行结果Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + "准备取数据!");queue.take();System.out.println(Thread.currentThread().getName() + "已经取走数据," + "队列目前有" + queue.size() + "个数据");} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}}
结果;
- 可阻塞的队列——ArrayBlockingQueue
- Java中的阻塞队列ArrayBlockingQueue的使用
- ArrayBlockingQueue阻塞队列的使用示例
- 阻塞队列使用---ArrayBlockingQueue
- JAVA 阻塞队列 ArrayBlockingQueue
- 阻塞队列之ArrayBlockingQueue
- 阻塞队列ArrayBlockingQueue说明
- 阻塞队列(ArrayBlockingQueue)
- 数组阻塞队列 ArrayBlockingQueue
- 阻塞队列之ArrayBlockingQueue
- 阻塞队列ArrayBlockingQueue
- 数组阻塞队列 ArrayBlockingQueue
- 多线程Demo-ArrayBlockingQueue阻塞队列
- JAVA阻塞队列之ArrayBlockingQueue
- 二 : ArrayBlockingQueue 数组阻塞队列
- JAVA多线程—可阻塞的队列类的介绍
- 多线程之间的交互:阻塞队列之ArrayBlockingQueue
- Java常用的2种阻塞队列ArrayBlockingQueue和LinkedBlockingQueue
- Asp.net web用户控件javascript中获取服务器控件ID
- 使用 Named Pipes 创建有效的连接字符串
- 【查找结构】二叉查找树
- 理解$HandlerLabel HANDLER $HandleLabel 宏
- Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)
- 可阻塞的队列——ArrayBlockingQueue
- 为自定义对话框添加菜单
- reltool使用指南
- 如何在sourceforge开源项目网站下载开源项目
- Android消息通知(notification)和PendingIntent传值
- http中的Content-Type
- DOM树操作
- 在Android C/C++层添加LOG调试(LOGI\LOGD\LOGE...)输出支持
- Binder机制编程