BlockingQueue 使用(生产者-消费者)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BlockingQueue 使用(生产者-消费者)相关的知识,希望对你有一定的参考价值。

参考技术A java.util.concurrent包中的Java BlockingQueue接口表示一个线程安全的队列,可以放入并获取实例。
在这篇文章中,我会告诉你如何使用这个BlockingQueue。

本文将不讨论如何在Java中实现BlockingQueue。如果您对此感兴趣,在我的偏理论的 Java并发教程 中有一个关于阻塞队列的文章。

BlockingQueue通常用于使线程产生对象,而另一线程则使用该对象。这是一张阐明这一原理的图表。

生产线程将持续生产新对象并将它们插入队列,直到队列达到它可以包含的上限。换句话说,这是极限。如果阻塞队列达到其上限,则会在尝试插入新对象时阻塞生产线程。在消耗线程将对象带出队列之前,它一直处于阻塞状态。

消费线程不断将对象从阻塞队列中取出,并对其进行处理。如果消费线程试图将对象从空队列中取出,则消费线程将被阻塞,直到生成的线程将对象放入队列。

BlockingQueue有4种不同的方法来插入、删除和检查队列中的元素。每一组方法的行为都是不同的,以防被请求的操作不能立即执行。下面是这些方法的一个表:

这四种不同的行为方式意思

无法将null插入到BlockingQueue中。如果尝试插入null,则BlockingQueue将引发NullPointerException。

也可以访问BlockingQueue中的所有元素,而不仅仅是开始和结束处的元素。例如,假设你需要处理队列中的一个对象,但你的应用程序决定不处理它。然后你可以调用remove(o)删除队列中的特定对象。但是,这并不是非常有效,所以除非你真的需要,否则不应该使用这些Collection方法

由于BlockingQueue是一个接口,因此您需要使用它的一个实现来使用它。java.util.concurrent包具有以下BlockingQueue接口(在Java 6中)的实现:

这是一个Java BlockingQueue示例。该示例使用BlockingQueue接口的ArrayBlockingQueue实现。

首先,BlockingQueueExample类在不同的线程中启动生产者和消费者。生产者将字符串插入共享BlockingQueue中,消费者将它们取出。

这是生产者类。注意它在每个put()调用之间的使用sleep。这将导致消费者在等待队列中的对象时阻塞。

这是消费者类。
它只是从队列中取出对象,并将它们打印到System.out。

[原文]( http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html

以上是关于BlockingQueue 使用(生产者-消费者)的主要内容,如果未能解决你的问题,请参考以下文章

Java阻塞队列BlockingQueue(生产者消费者模型)

Java阻塞队列BlockingQueue(生产者消费者模型)

多线程-生产者消费者(BlockingQueue实现)

Java多线程:BlockingQueue实现生产者消费者模型

java 生产者消费者(BlockingQueue实现)

[Java并发编程实战] 阻塞队列 BlockingQueue(含代码,生产者-消费者模型)