要点:
- 不需要产生结果和消费结果的线程一一对应
- 消费队列可以用来平衡生产和消费的线程资源
- 生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据
- 消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据
- JDK中各种阻塞队列,采用的就是这种模式
//消息类
public class Message {
private int id;
private Object massage;
public Message(int id, Object massage) {
this.id = id;
this.massage = massage;
}
public int getId() {
return id;
}
public Object getMassage() {
return massage;
}
}
//消息队列类
public class MessageQueue {
/**消息队列*/
private LinkedList<Message> queue;
/**队列容量*/
private int capacity;
public MessageQueue(int capacity){
this.capacity=capacity;
queue=new LinkedList<>();
}
/**取出数据*/
public Message take() {
synchronized (this){
//判断队列是否为空
while (queue.isEmpty()){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//取出队头的数据
Message message = queue.removeFirst();
this.notifyAll();
return message;
}
}
/**加入数据*/
public void put(Message message){
synchronized (this){
//判断队列是否为满
while (queue.size() == capacity){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//将数据加入队尾
queue.addLast(message);
this.notifyAll();
}
}
}