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(生产者消费者模型)