系列文章目录
Java多线程【1】synchronized对象锁、内置锁使用
Java多线程【2】Java wait/notify的使用于同步模式保护性暂停
Java多线程【3】同步模式之保护性暂停案例 相亲问题
Java多线程【4】interrupt线程的打断机制、两阶段终止模式
Java多线程【5】异步模式之生产者消费者
Java多线程【6】LockSupport park/unpark原理和使用以及于wait/notify的区别
前言
保护性暂停为同步,生产者消费者模式为异步模式。生产消费者模式维护一个list,生产者负责产生结果数据不关心数据如何处理,消费者之专心处理结果数据。
一、与保护性暂停的区别?
- 不需要生产和消费线程一一对应。
- 保护性暂停维护的是一个map,存储线程的id和线程的状态,生产消费者维护的是一个list。
- 有容量限制,且队列是阻塞的。
二、队列类
- 声明list集合
- 声明消息容量
public class Queen {
//消息容量
private Integer capacity;
//消息队列
private final LinkedList<Message> list = new LinkedList<>();
public Queen(Integer capacity) {
this.capacity = capacity;
}
public Message take(){
synchronized (list){
while (list.isEmpty()){
try {
list.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
Message message = list.removeLast();
list.notifyAll();
return message;
}
}
public void push(Message message){
synchronized (list){
while (list.size() == capacity){
try {
list.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
list.addFirst(message);
//唤醒消费者线程
list.notifyAll();
}
}
总结
生产者消费者模式运用的非常广泛,在mq消息队列中是使用进程级别的生产消费,这里的生产消费只是线程级别的,仅仅供读者进行理解和参考。