image.png
队列为空时,Take进入阻塞状态(线程被挂起)
队列为满时,Put进入阻塞状态(线程被挂起)

1、阻塞队列的分类

  • ArrayBlockingQueue

定长数组,有数组组成的有界面的阻塞队列

  • LinkedBlockingQueue

有链表结构组成的有界的阻塞队列(大小默认值为Integer.MAX_VALUE)

  • DelayQueue

使用优先级队列实现的延迟无界阻塞队列

  • PriorityBlockingQueue

支持优先级排序的无界阻塞队列

  • SynchronousQueue

不存储元素的阻塞队列,也即单个元素的队列

  • LinkedTransferQueue

有链表组成的无界阻塞队列

  • LinkedBlockingDeque

由链表组成的双向阻塞队列

2、阻塞队列常用的方法

image.png

3、阻塞队列常用方法演示

  1. public class BlockingQueueDemo {
  2. public static void main(String[] args) throws InterruptedException {
  3. //设置数组的长度为3
  4. BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
  5. /*
  6. //抛出异常
  7. System.out.println(queue.add("a"));
  8. System.out.println(queue.add("b"));
  9. System.out.println(queue.add("c"));
  10. // System.out.println(queue.add("d"));报错
  11. // System.out.println(queue.element());获取队头元素
  12. System.out.println(queue.remove("a"));
  13. System.out.println(queue.remove("b"));
  14. System.out.println(queue.remove("c"));
  15. System.out.println(queue.remove("d"));//false */
  16. /*
  17. //特殊值
  18. System.out.println(queue.offer("a"));
  19. System.out.println(queue.offer("b"));
  20. System.out.println(queue.offer("c"));
  21. // System.out.println(queue.offer("d"));//falsse
  22. // System.out.println(queue.peek());//获取队头元素
  23. System.out.println(queue.poll());//取出队头元素
  24. System.out.println(queue.poll());
  25. System.out.println(queue.poll());
  26. // System.out.println(queue.poll());//null */
  27. /*
  28. //阻塞
  29. queue.put("a");
  30. queue.put("b");
  31. queue.put("c");
  32. // queue.put("d");//处于阻塞状态,程序不会停止
  33. queue.take();
  34. queue.take();
  35. queue.take();
  36. queue.take();//处于阻塞状态,程序不会停止 */
  37. //超时
  38. queue.offer("a", 3L, TimeUnit.SECONDS);//设置超时时间为3秒
  39. queue.offer("b", 3L, TimeUnit.SECONDS);
  40. queue.offer("c", 3L, TimeUnit.SECONDS);
  41. queue.offer("d", 3L, TimeUnit.SECONDS);//超过3秒程序自动结束
  42. queue.poll(3L, TimeUnit.SECONDS);//取出时设置的超时时间也跟放入时一样
  43. queue.poll(3L, TimeUnit.SECONDS);
  44. queue.poll(3L, TimeUnit.SECONDS);
  45. queue.poll(3L, TimeUnit.SECONDS);
  46. }
  47. }