一个简单的阻塞队列实现
2011-12-06 21:16
507 查看
闲话不说,直接 上代码。
闲来无事,随手写的一个简单实现,如有错误,还请斧正。。~~
/** * 一个简单的阻塞队列 * * @author Kevin * * @param <E> */ class SimpleBlockingQueue<E> { /** * 默认的队列容量 */ private static final int DEFAULT_CAPACITY = 128; /* 存储队列元素的数组 */ private E[] queue; /* 队列初始容量 */ private int capacity; /* 队列中元素个数 */ private int size; /* 队头索引 */ private int head; /* 队尾索引 */ private int tail; /* 显示锁 */ private Lock lock = new ReentrantLock(); /* 条件谓词:size<capacity */ private Condition notFull = lock.newCondition(); /* 条件谓词:size>0 */ private Condition notEmpty = lock.newCondition(); public SimpleBlockingQueue() { this(DEFAULT_CAPACITY); } public SimpleBlockingQueue(int capacity) { this.capacity = capacity; queue = (E[]) new Object[capacity]; } /** * 用传递的集合的元素作为队列 的初始元素 * * @param c * @param capacity */ public SimpleBlockingQueue(Collection<E> c, int capacity) { this(capacity); // 如果传入的初始容量小于集合的大小 ,则抛出异常 if (capacity < c.size()) { throw new IllegalArgumentException(""); } Iterator<E> iter = c.iterator(); while (iter.hasNext()) { queue[tail++] = iter.next(); ++size; } } /** * 添加一个元素到队尾,如果队列已满,该方法将阻塞 * @param element * @throws InterruptedException */ public void put(E element) throws InterruptedException { lock.lock(); try { while (size >= capacity) { notFull.await(); } queue[tail] = element; if (++tail == capacity) { tail = 0; } ++size; notEmpty.signal(); } finally { lock.unlock(); } } /** * 从队头移除一个元素,并返回该元素,如果队列 为空,将阻塞直到有元素 为止 * @return * @throws InterruptedException */ public E take() throws InterruptedException { lock.lock(); try { while (size == 0) { notEmpty.await(); } E value = queue[head]; queue[head] = null; if (++head == capacity) { head = 0; } --size; notFull.signal(); return value; } finally { lock.unlock(); } } }
闲来无事,随手写的一个简单实现,如有错误,还请斧正。。~~
相关文章推荐
- 【JAVA】简单实现一个阻塞任务队列
- 简单算法 - 用两个栈实现一个队列
- C#实现一个简单的工作队列调度器
- javaweb简单实现前台请求的非阻塞消息队列(ConcurrentLinkedQueue)
- C语言实现一个最简单的队列
- 请实现一个队列,既可以存放整数,又可以存放字符串。简单的说,队列是一种数据结构,按照先进先出的顺序管理进、出队列的元素
- java 环形阻塞队列简单实现
- 一个简单的队列实现
- 请实现一个队列,既可以存放整数,又可以存放字符串。简单的说,队列是一种数据结构,按照先进先出的顺序管理进、出队列的元素
- [原创][Java]一个简单高效的线程安全队列的JAVA实现
- Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列
- 链表实现一个简单的队列
- [直播一揽子]一个简单的无所队列的C实现
- c++ 多线程阻塞队列的简单实现
- 基于C++11的阻塞队列简单实现
- 实现一个简单的服务端推送方案-实例篇Polling(服务端阻塞读,SLEEP方式读MYSQL)
- 简单算法 - 两个队列实现一个栈
- 请实现一个队列,既可以存放整数,又可以存放字符串。简单的说,队列是一种数据结构,按照先进先出的顺序管理进、出队列的元素
- 自己实现一个简单的优先队列-二叉堆
- 数据结构学习三(一个简单的队列实现)