
队列为空时,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 {//设置数组的长度为3BlockingQueue<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);}}
