队列为空时,Take进入阻塞状态(线程被挂起)
队列为满时,Put进入阻塞状态(线程被挂起)
1、阻塞队列的分类
- ArrayBlockingQueue
定长数组,有数组组成的有界面的阻塞队列
- LinkedBlockingQueue
有链表结构组成的有界的阻塞队列(大小默认值为Integer.MAX_VALUE)
- DelayQueue
使用优先级队列实现的延迟无界阻塞队列
- PriorityBlockingQueue
支持优先级排序的无界阻塞队列
- SynchronousQueue
不存储元素的阻塞队列,也即单个元素的队列
- LinkedTransferQueue
有链表组成的无界阻塞队列
- LinkedBlockingDeque
2、阻塞队列常用的方法
3、阻塞队列常用方法演示
public class BlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
//设置数组的长度为3
BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
/*
//抛出异常
System.out.println(queue.add("a"));
System.out.println(queue.add("b"));
System.out.println(queue.add("c"));
// System.out.println(queue.add("d"));报错
// System.out.println(queue.element());获取队头元素
System.out.println(queue.remove("a"));
System.out.println(queue.remove("b"));
System.out.println(queue.remove("c"));
System.out.println(queue.remove("d"));//false */
/*
//特殊值
System.out.println(queue.offer("a"));
System.out.println(queue.offer("b"));
System.out.println(queue.offer("c"));
// System.out.println(queue.offer("d"));//falsse
// System.out.println(queue.peek());//获取队头元素
System.out.println(queue.poll());//取出队头元素
System.out.println(queue.poll());
System.out.println(queue.poll());
// System.out.println(queue.poll());//null */
/*
//阻塞
queue.put("a");
queue.put("b");
queue.put("c");
// queue.put("d");//处于阻塞状态,程序不会停止
queue.take();
queue.take();
queue.take();
queue.take();//处于阻塞状态,程序不会停止 */
//超时
queue.offer("a", 3L, TimeUnit.SECONDS);//设置超时时间为3秒
queue.offer("b", 3L, TimeUnit.SECONDS);
queue.offer("c", 3L, TimeUnit.SECONDS);
queue.offer("d", 3L, TimeUnit.SECONDS);//超过3秒程序自动结束
queue.poll(3L, TimeUnit.SECONDS);//取出时设置的超时时间也跟放入时一样
queue.poll(3L, TimeUnit.SECONDS);
queue.poll(3L, TimeUnit.SECONDS);
queue.poll(3L, TimeUnit.SECONDS);
}
}