阻塞队列
阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,用法大同小异,具体可查看JDK文档,这里简单举例看下ArrayBlockingQueue,它实现了一个有界队列,当队列满时,便会阻塞等待,直到有元素出队,后续的元素才可以被加入队列
package test; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class BlockingQueueTest { @SuppressWarnings("unchecked") public static void main(String[] args) throws InterruptedException { BlockingQueue bqueue = new ArrayBlockingQueue(10); for (int i = 1; i < 30; i++) { bqueue.put(i); System.out.println("阻塞队列添加元素:" + i); } System.out.println("----程序结束----"); } }
输出到元素19时候,就一直处于等待状态。这里没有用多线程来演示,没有这个必要
阻塞队列提供了四种处理方法:
方法\处理方式 | 抛出异常 | 返回特殊值 | 一直阻塞 | 超时退出 |
插入方法 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
移除方法 | remove() | poll() | take() | poll(time,unit) |
检查方法 | element() | peek() | 不可用 | 不可用 |
抛出异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Queue full”)异常。当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。
返回特殊值:插入方法会返回是否成功,成功则返回true。移除方法,则是从队列里拿出一个元素,如果没有则返回null
一直阻塞:当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里take元素,队列也会阻塞消费者线程,直到队列可用。
超时退出:当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超过一定的时间,生产者线程就会退出。
JDK6提供了6个阻塞队列:
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue
阻塞栈
阻塞栈与阻塞队列相似,只是它是Java 6中加入的新特性,阻塞栈的接口java.util.concurrent.BlockingDeque也有很多实现类,使用方法也比较相似
package test; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; // 注意使用JDK6 public class BlockingDequeTest { @SuppressWarnings("unchecked") public static void main(String[] args) { BlockingDeque deque = new LinkedBlockingDeque(10); for (int i = 0; i < 30; i++) { try { //deque.addFirst(i); // 使用addFirst满时报错 deque.putFirst(i); //deque.addLast(i); // 向尾部增加 //deque.putLast(i); } catch (Exception e) { e.printStackTrace(); } System.out.println("阻塞栈添加元素:" + i); } System.out.println("----程序结束----"); } }
效果是一致的,只是我们看到的是栈的特性!
请您到ITEYE网站看 java小强 原创,谢谢!