Queue是一个队列,特征是FIFO,如果要实现生产者与消费者模式,
可以采用队列来进行中间的缓冲处理,好处:生产者可以一直不停歇的生产数据。
可以采用队列来进行中间的缓冲处理,好处:生产者可以一直不停歇的生产数据。
BlockingQueue是Queue子接口。所以它实现有队列的基本特征:
Public interface BlockingQueue<E> extends Queue<E>
在最初利用Queue实现生产者与消费者模型时发现一个问题:所有的消费者可能不是一个个轮流操作,
而是有可能某一个消费者会长期进行消费处理。
【 阻塞队列 】
➤ BlockingQueue通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。
➤ 一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界
点。也就是说,它是有限的。如果该阻塞队列达到了其临界点,负责生产的线程将会在
往里边插入新对象时发生阻塞。它会一直处于阻塞之中,直到负责消费的线程从队列中
拿走一个对象。
BlockingQueue也是一个处理接口,如果要想操作BlockingQueue也需要使用它的一系列子类。
【 BlockingQueue基础子类 】
对于阻塞队列而言最基础的两个实现子类:数组的队列、链表的队列。
范例:使用BlockingQueue实现一个生产者与消费者模型
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
public class MLDNTestDemo {
public static void main(String[] args) throws Exception {
// 允许保存5个数据队列
BlockingQueue<String> queue =
new ArrayBlockingQueue<String>(5);
for (int x = 0; x < 3; x++) {
new Thread(() -> {
for (int y = 0; y < 5; y++) {
try {
TimeUnit.SECONDS.sleep(1);
String str = "【生产数据{"
+ Thread.currentThread().getName()
+ "}】y = " + y ;
queue.put(str); // 会进入到生产的阻塞状态
System.out.println(str);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "生产者-" + x).start();
}
for (int x = 0; x < 5; x++) {
new Thread(() -> {
while (true) {
try {
TimeUnit.SECONDS.sleep(2);
// 队列内容为空了
if (queue.isEmpty()) {
break; // 结束循环
}
System.out.println("【消费数据{"