java.util.concurrent
接口 BlockingQueue<E>
类型参数:
E
- 在此 collection 中保持的元素类型
所有超级接口:
Collection
<E>, Iterable
<E>, Queue
<E>
所有已知实现类:
ArrayBlockingQueue
, DelayQueue
, LinkedBlockingQueue
, PriorityBlockingQueue
, SynchronousQueue
public interface BlockingQueue<E>
extends Queue
<E>
支持两个附加操作的 Queue
,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。
BlockingQueue
不接受 null
元素。试图 add
、put
或 offer
一个 null
元素时,某些实现会抛出 NullPointerException
。null
被用作指示 poll
操作失败的警戒值。
BlockingQueue
可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity
,超出此容量,便无法无阻塞地 put
额外的元素。没有任何内部容量约束的 BlockingQueue
总是报告 Integer.MAX_VALUE
的剩余容量。
BlockingQueue
实现主要用于生产者-使用者队列,但它另外还支持 Collection
接口。因此,举例来说,使用 remove(x)
从队列中移除任意一个元素是有可能的。然而,这种操作通常不
会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。
BlockingQueue
实现是线程安全的。所有排队方法都可以使用内部锁定或其他形式的并发控制来自动达到它们的目的。然而,大量的
Collection 操作(addAll
、containsAll
、retainAll
和 removeAll
)没有
必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 c
中的一些元素后,addAll(c)
有可能失败(抛出一个异常)。
BlockingQueue
实质上不
支持使用任何一种“close”或“shutdown”操作来指示不再添加任何项。这种功能的需求和使用有依赖于实现的倾向。例如,一种常用的策略是:对于生产者,插入特殊的 end-of-stream
或 poison
对象,并根据使用者获取这些对象的时间来对它们进行解释。
以下是基于典型的生产者-使用者场景的一个用例。注意,BlockingQueue
可以安全地与多个生产者和多个使用者一起使用。
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while(true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... handle ...}
}
Object produce() { ... }
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while(true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... handle ...}
}
void consume(Object x) { ... }
}
class Setup {
void main() {
BlockingQueue q = new SomeQueueImplementation();
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
此接口是 Java Collections Framework
的成员。
从以下版本开始:
1.5
<!-- ========== METHOD SUMMARY =========== -->
<!-- -->
方法摘要
boolean
|
add
(E
o)
将指定的元素添加到此队列中(如果立即可行),在成功时返回 true
,其他情况则抛出 IllegalStateException。 |
int
|
drainTo
(Collection
<? super E
> c)
移除此队列中所有可用的元素,并将它们添加到给定 collection 中。 |
int
|
drainTo
(Collection
<? super E
> c,
int maxElements)
最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中。 |
boolean
|
offer
(E
o)
如果可能的话,将指定元素插入此队列中。 |
boolean
|
offer
(E
o,
long timeout,
TimeUnit
unit)
将指定的元素插入此队列中,如果没有可用空间,将等待指定的等待时间(如果有必要)。 |
E
|
poll
(long timeout,
TimeUnit
unit)
检索并移除此队列的头部,如果此队列中没有任何元素,则等待指定等待的时间(如果有必要)。 |
void
|
put
(E
o)
将指定元素添加到此队列中,如果没有可用空间,将一直等待(如果有必要)。 |
int
|
remainingCapacity
()
返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的元素数量;如果没有内部限制,则返回 Integer.MAX_VALUE
。 |
E
|
take
()
检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。 |
<!-- -->
分享到:
相关推荐
BlockingQueue<Integer> buffer = new ArrayBlockingQueue<>(10); // 容量为10的队列 ``` 2. 接着,创建生产者线程,它会生成数据并放入缓冲区: ```java class Producer implements Runnable { private final ...
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10); Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread....
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread.start...
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5); // 创建一个大小为5的队列 Thread producer = new Thread(new Producer(queue)); // 生产者线程 Thread consumer = new Thread(new Consumer...
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10); Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread....
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(capacity); ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(new Producer(queue)); executor.execute(new Consumer...
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10); ``` 2. **定义生产者线程**:生产者线程将创建产品并将其放入队列。使用`while`循环持续生产,`try-catch`块处理可能出现的`InterruptedException`,...
BlockingQueue<Product> queue = new LinkedList<>(); new Thread(new Producer(queue)).start(); new Thread(new Consumer(queue)).start(); } } ``` 在实际应用中,可以使用`LinkedBlockingQueue`或其他类型...
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); Thread producer = new Thread(new Producer(queue)); Thread consumer = new Thread(new Consumer(queue)); producer.start(); consumer.start...
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10); // 设置队列大小为10 // 创建生产者和消费者线程 Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new ...
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10); // 创建一个容量为10的队列 Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer...
BlockingQueue<String> queue = new LinkedBlockingQueue<>(); Producer producer = new Producer(queue); Consumer consumer = new Consumer(queue); producer.start(); consumer.start(); } } ``` 在这个...
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10); // 创建容量为10的队列 Thread producer = new Thread(new Producer(queue)); // 生产者线程 Thread consumer = new Thread(new Consumer(queue...
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10); Thread producer = new Thread(new Producer(queue)); Thread consumer = new Thread(new Consumer(queue)); producer.start(); consumer....
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); new Thread(new Producer(queue)).start(); new Thread(new Consumer(queue)).start(); } } ``` 在这个例子中,`Producer` 线程将数字放入队列,...
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10); // 启动生产者线程 Thread producerThread = new Thread(new Producer(queue)); producerThread.start(); // 启动消费者线程 Thread consumer...
ArrayBlockingQueue<Data> queue = new ArrayBlockingQueue<>(10); Thread producer = new Thread(new Producer(queue)); Thread consumer = new Thread(new Consumer(queue)); producer.start(); consumer....
BlockingQueue<FutureTask> taskQueue = new ArrayBlockingQueue<>(100); public void submitTask(Callable<?> callable, long timeout, TimeUnit unit) { FutureTask task = new FutureTask<>(callable); ...
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10); // 创建一个容量为10的队列 ``` 接下来,我们将创建生产者和消费者线程类。生产者线程会生成数据并尝试将其放入队列,而消费者线程则会从队列中取出...