Queue队列

image.png

阻塞队列-BlockingQueue 是一个接口。

image.png
BlockingQueue 不是新的东西
image.png

四组API

image.png

api演示

  1. import java.util.Collection;
  2. import java.util.concurrent.ArrayBlockingQueue;
  3. import java.util.concurrent.TimeUnit;
  4. public class Test {
  5. public static void main(String[] args) throws InterruptedException {
  6. test4();
  7. }
  8. /**
  9. * 抛出异常
  10. */
  11. public static void test1(){
  12. // 队列的大小
  13. ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
  14. System.out.println(blockingQueue.add("a"));
  15. System.out.println(blockingQueue.add("b"));
  16. System.out.println(blockingQueue.add("c"));
  17. // IllegalStateException: Queue full 抛出异常!
  18. // System.out.println(blockingQueue.add("d"));
  19. System.out.println("=-===========");
  20. System.out.println(blockingQueue.element()); // 查看队首元素是谁
  21. System.out.println(blockingQueue.remove());
  22. System.out.println(blockingQueue.remove());
  23. System.out.println(blockingQueue.remove());
  24. // java.util.NoSuchElementException 抛出异常!
  25. // System.out.println(blockingQueue.remove());
  26. }
  27. /**
  28. * 有返回值,没有异常
  29. */
  30. public static void test2(){
  31. // 队列的大小
  32. ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
  33. System.out.println(blockingQueue.offer("a"));
  34. System.out.println(blockingQueue.offer("b"));
  35. System.out.println(blockingQueue.offer("c"));
  36. System.out.println(blockingQueue.peek());
  37. // System.out.println(blockingQueue.offer("d")); // false 不抛出异常!
  38. System.out.println("============================");
  39. System.out.println(blockingQueue.poll());
  40. System.out.println(blockingQueue.poll());
  41. System.out.println(blockingQueue.poll());
  42. System.out.println(blockingQueue.poll()); // null 不抛出异常!
  43. }
  44. /**
  45. * 等待,阻塞(一直阻塞)
  46. */
  47. public static void test3() throws InterruptedException {
  48. // 队列的大小
  49. ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
  50. // 一直阻塞
  51. blockingQueue.put("a");
  52. blockingQueue.put("b");
  53. blockingQueue.put("c");
  54. // blockingQueue.put("d"); // 队列没有位置了,一直阻塞
  55. System.out.println(blockingQueue.take());
  56. System.out.println(blockingQueue.take());
  57. System.out.println(blockingQueue.take());
  58. System.out.println(blockingQueue.take()); // 没有这个元素,一直阻塞
  59. }
  60. /**
  61. * 等待,阻塞(等待超时)
  62. */
  63. public static void test4() throws InterruptedException {
  64. // 队列的大小
  65. ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
  66. blockingQueue.offer("a");
  67. blockingQueue.offer("b");
  68. blockingQueue.offer("c");
  69. // blockingQueue.offer("d",2,TimeUnit.SECONDS); // 等待超过2秒就退出
  70. System.out.println("===============");
  71. System.out.println(blockingQueue.poll());
  72. System.out.println(blockingQueue.poll());
  73. System.out.println(blockingQueue.poll());
  74. blockingQueue.poll(2,TimeUnit.SECONDS); // 等待超过2秒就退出
  75. }
  76. }