package com.juc.mq;
import lombok.extern.slf4j.Slf4j;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* @author zzyuan
* @create 2022-04-14 15:28
*/
@Slf4j(topic = "c.Test21")
public class Test21 {
public static void main(String[] args) {
MessageQueue mq = new MessageQueue(2);
for (int i = 0; i < 4; i++) {
int id = i;
new Thread(()->{
mq.put(new Message(id,"val-"+id));
},"生产者").start();
}
new Thread(()->{
while (true){
try {
Thread.sleep(1000);//每隔1秒去mq中取消息
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = mq.take();
}
},"消费者").start();
}
}
@Slf4j(topic = "c.MessageQueue")
class MessageQueue{
private LinkedList<Message> queue;
private int capacity;
public MessageQueue(int capacity) {
this.queue = new LinkedList<>();
this.capacity = capacity;
}
//获取消息
public Message take(){
synchronized (queue){
//检查队列是否为null
while (queue.isEmpty()){
try {
log.debug("队列为空,消费者线程等待");
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//从队列的头部获取消息返回
Message message = queue.removeFirst();
log.debug("消费者消费一条消息{}",message);
queue.notifyAll();
return message;
}
}
//存入消息
public void put(Message message){
synchronized (queue){
while (queue.size() == capacity){
try {
log.debug("队列以满,生产者等待");
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
queue.addLast(message);
log.debug("生产出一个消息{}",message);
queue.notifyAll();
}
}
}
final class Message{
private int id;
private Object object;
public Message(int id, Object object) {
this.id = id;
this.object = object;
}
public int getId() {
return id;
}
public Object getObject() {
return object;
}
@Override
public String toString() {
return "Message{" +
"id=" + id +
", object=" + object +
'}';
}
}
生产者消费者模式(java)
最新推荐文章于 2024-05-11 17:46:59 发布