JAVA中常见的阻塞队列详解( 二 )

 异常返回无异常offer添加一个元素当队列已满,不会报异常,返回 false ,如果成功返回 true poll获取队列头节点,并且删除它当队列空时,返回 Null peek单纯获取头节点当队列为空时反馈 NULL阻塞put添加一个元素如果队列已满则阻塞 take返回并删除头元素如果队列为空则阻塞

  • 如上面所示主要的八个方法,相对都比较简单,下面我们通过实际代码演示的方式来认识
抛异常类型[add、remove、element]add
  • 向队列中添加一个元素 。如果队列是有界队列,当队列已满时再添加则抛出异常提示,如下:
BlockingQueue queue = new ArrayBlockingQueue(2);queue.add(1);queue.add(2);queue.add(3);
  • 上述代码中我们创建了一个阻塞队列容量为2,当我们使用 add 向其中添加元素,当添加到第三个时则会抛出异常如下:

JAVA中常见的阻塞队列详解

文章插图
remove
  • remove 方法是从队列中删除队列的头节点,同时会返回该元素 。当队列中为空时执行 remove 方法时则会抛出异常,代码如下:
private static void groupRemove() {BlockingQueue queue = new ArrayBlockingQueue(2);queue.add("i-code.online");System.out.println(queue.remove());System.out.println(queue.remove());}
  • 上述代码中,我们可以看到,我们想队列中添加了一个元素 i-code.online , 之后通过 remove 方法进行删除,当执行第二次remove 时队列内已无元素,则抛出异常 。如下:

JAVA中常见的阻塞队列详解

文章插图
element
  • element 方法是获取队列的头元素,但是并不是删除该元素,这也是与 remove 的区别,当队列中没有元素后我们再执行 element 方法时则会抛出异常,代码如下:
private static void groupElement() {BlockingQueue queue = new ArrayBlockingQueue(2);queue.add("i-code.online");System.out.println(queue.element());System.out.println(queue.element());}private static void groupElement2() {BlockingQueue queue = new ArrayBlockingQueue(2);System.out.println(queue.element());}
  • 上面两个方法分别演示了在有元素和无元素的情况element 的使用 。在第一个方法中并不会报错,因为首元素一直存在的,第二个方法中因为空的,所以抛出异常,如下结果:

JAVA中常见的阻塞队列详解

文章插图
无异常类型[offer、poll、peek]offer
  • offer 方法是向队列中添加元素, 同时反馈成功与失败,如果失败则返回 false ,当队列已满时继续添加则会失败,代码如下:
private static void groupOffer() {BlockingQueue queue = new ArrayBlockingQueue(2);System.out.println(queue.offer("i-code.online"));System.out.println(queue.offer("云栖简码"));System.out.println(queue.offer("AnonyStar"));}
  • 如上述代码所示,我们向一个容量为2的队列中通过offer 添加元素,当添加第三个时,则会反馈 false ,如下结果:
truetruefalsepoll
  • poll 方法对应上面 remove 方法,两者的区别就在于是否会在无元素情况下抛出异常,poll 方法在无元素时不会抛出异常而是返回null ,如下代码:
private static void groupPoll() {BlockingQueue queue = new ArrayBlockingQueue(2);System.out.println(queue.offer("云栖简码")); //添加元素System.out.println(queue.poll()); //取出头元素并且删除System.out.println(queue.poll());}
  • 上面代码中我们创建一个容量为2的队列,并添加一个元素,之后调用两次poll方法来获取并删除头节点,发现第二次调用时为null ,因为队列中已经为空了,如下:
true云栖简码nullpeek
  • peek 方法与前面的 element 方法是对应的,获取元素头节点但不删除,与其不同的在于peek 方法在空队列下并不会抛出异常,而是返回 null,如下:
private static void groupPeek() {BlockingQueue queue = new ArrayBlockingQueue(2);System.out.println(queue.offer(1));System.out.println(queue.peek());System.out.println(queue.peek());}private static void groupPeek2() {BlockingQueue queue = new ArrayBlockingQueue(2);System.out.println(queue.peek());}


推荐阅读