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
的一些常见实现是:
- ArrayBlockingQueue
- 的 LinkedBlockingQueue
- 的 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
并且在第二次输出后线程将被阻塞。