与前面的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应
消费队列可以用来平衡生产和消费的线程资源
生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据
消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据
JDK 中各种阻塞队列,采用的就是这种模式。
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
/**
* @program: offer
* @description:
* @author: liyuecheng
* @create: 2020-06-03 10:24
**/
public class MessageQueue {
private Deque<String> queue = new LinkedList<>();
private int capacity;
public MessageQueue(int capacity) {
this.capacity = capacity;
}
public String take(){
synchronized (queue) {
while (queue.size() == 0) {
try {
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
queue.notifyAll();
return queue.removeFirst();
}
}
public void put(String message){
synchronized (queue){
while (queue.size()==capacity){
try {
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
queue.addLast(message);
queue.notifyAll();
}
}
public static void main(String[] args) {
MessageQueue mq = new MessageQueue(2);
new Thread(
()->{
while(true) {
String message = mq.take();
System.out.println("putThread get message:" + message);
}
}, "putThread"
).start();
new Thread(
()->{
System.out.println("takeThread put message");
mq.put("1");
System.out.println("takeThread put message");
mq.put("2");
System.out.println("takeThread put message");
mq.put("3");
System.out.println("takeThread put message");
mq.put("4");
}, "takeThread"
).start();
}
}