BlockingQueue

BlockingQueue 是一个接口,它是一个队列,当你尝试从队列中出队并且队列为空时阻塞,或者如果你尝试将项目排入队列且队列已满。尝试从空队列中出队的线程被阻塞,直到某个其他线程将项目插入队列。尝试将完整队列中的项排入队列的线程将被阻塞,直到某个其他线程在队列中创建空间,方法是将一个或多个项目出列或完全清除队列。

BlockingQueue 方法有四种形式,有不同的处理操作方式,不能立即满足,但可能在将来的某个时候得到满足:一个抛出异常,第二个返回一个特殊值(null 或 false,取决于操作),第三个无限期地阻塞当前线程直到操作成功,并且第四个块在放弃之前仅用于给定的最大时间限制。

操作 抛出异常 特殊值 Blocks 超时
插入 add() offer(e) put(e) offer(e, time, unit)
删除 remove() poll(e) take() poll(time, unit)
检查 element() peek() N/A N/ A

BlockingQueue 可以是有界的无界的。有界 BlockingQueue 是初始化初始容量的 BlockingQueue。

BlockingQueue<String> bQueue = new ArrayBlockingQueue<String>(2);

如果队列的大小等于定义的初始容量,则将阻止对 put() 方法的任何调用。

无界队列是一个没有容量初始化的队列,实际上默认情况下是用 Integer.MAX_VALUE 初始化的。

BlockingQueue 的一些常见实现是:

  1. ArrayBlockingQueue
  2. 的 LinkedBlockingQueue
  3. 的 PriorityBlockingQueue

现在让我们看一下 ArrayBlockingQueue 的一个例子:

BlockingQueue<String> bQueue = new ArrayBlockingQueue<>(2);
bQueue.put("This is entry 1");
System.out.println("Entry one done");
bQueue.put("This is entry 2");
System.out.println("Entry two done");
bQueue.put("This is entry 3");
System.out.println("Entry three done");

这将打印:

Entry one done
Entry two done

并且在第二次输出后线程将被阻塞。