阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue。 java
阻塞队列是一个指定长度的队列,若是队列满了,添加新元素的操做会被阻塞等待,直到有空位为止。一样,当队列为空时候,请求队列元素的操做一样会阻塞等待,直到有可用元素为止。 dom
遵循先进先出的原则。 线程
阻塞队列有不少实现类,用来知足各类复杂的需求:ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue,SynchronousQueue ,API差异也很小。 code
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class BlockingQueueTest { public static void main(String[] args) { final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(5); 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(); } }
对于阻塞栈,与阻塞队列类似。不一样点在于栈是“后入先出”的结构,每次操做的是栈顶,而队列是“先进先出”的结构,每次操做的是队列头。 接口
这里要特别说明一点的是,阻塞栈是Java6的新特征。 队列
Java为阻塞栈定义了接口:java.util.concurrent.BlockingDeque,其实现类也比较多,具体能够查看JavaAPI文档。