本文中,我们将介绍一个 java.util.concurrent 包提供的用于解决并发生产者 – 消费者问题的最有用的类 – BlockQueue。我们将介绍BlockingQueue 接口的 API 以及如何使用该接口的方法使编写并发程序更容易。
在本文的后面,我们将展示一个具有多个生产者线程和多个消费者线程的简单程序的示例。
BlockingQueue 的队列类型
java.util.concurrent 提供了两种类型的 BlockingQueue:
1、 无限队列(unboundedqueue)–几乎可以无限增长;
2、 有限队列(boundedqueue)–定义了最大容量;
无限队列
创建一个无限队列的方法很简单
BlockingQueue<String> blockingQueue = new LinkedBlockingDeque<>();
上面这段代码中,blockingQueue 的容量将设置为 Integer.MAX_VALUE 。
向无限队列添加元素的所有操作都将永远不会阻塞,因此它可以增长到非常大的容量。
使用无限 BlockingQueue 设计生产者 – 消费者模型时最重要的是 消费者应该能够像生产者向队列添加消息一样快地消费消息 。否则,内存可能会填满,然后就会得到一个 OutOfMemory 异常。
有限队列
第二种类型的队列是有限队列。我们可以通过将容量作为参数传递给构造函数来创建这样的队列
BlockingQueue<String> blockingQueue = new LinkedBlockingDeque<>(10);
上面这句代码中,我们设置了 blockingQueue 的容量为 10 。这意味着当消费者尝试将元素添加到已经满了的队列时,结果取决于添加元素的方法( offer() 、add() 、put() ) ,它将阻塞,直到有足够的空间可以插入元素。否则,添加操作将会失败。
使用有限队列是设计并发程序的好方法ÿ