代码
import lombok.extern.slf4j.Slf4j;
import java.util.LinkedList;
final class Message{//单条消息
private int id;
private String message;
public Message(int id, String message) {
this.id = id;
this.message = message;
}
public int getId() {
return id;
}
public String getMessage() {
return message;
}
}
@Slf4j(topic = "c.MessageQueue")//日志打印注解,可以用System.out.println()替代
class MessageQueue{//消息队列
private static LinkedList<Message> linkedList = new LinkedList();
private int capacity;//队列容量
public MessageQueue(int capacity) {
this.capacity = capacity;
}
public void productor(Message message){//生产
synchronized (linkedList){//对象上锁
while (linkedList.size() == capacity){//消息队列满,无法生产入队
try {
log.debug("队列已满, 生产者线程等待");
linkedList.wait();//进入waitSet等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
linkedList.addLast(message);//消息队列未满,进行入队添加
linkedList.notifyAll();//唤醒waitSet中线程
log.debug("product message:{} id:{}",message.getMessage(),message.getId());//可以用System.out.println()替代
}
}
public void consumer(){//消费
synchronized (linkedList){//对象上锁
while (linkedList.isEmpty()){//消息队列空,无法消费出队
try {
log.debug("队列为空, 消费者线程等待");
linkedList.wait();//进入waitSet等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Message message = linkedList.removeFirst();//消息队列不空,进行出队移除
log.debug("consumer message:{} id:{}",message.getMessage(),message.getId());//可以用System.out.println()替代
linkedList.notifyAll();//唤醒waitSet中线程
}
}
}
@Slf4j(topic = "c.BoundedBufferProblem")
public class BoundedBufferProblem {
public static void main(String[] args) throws InterruptedException {
MessageQueue queue = new MessageQueue(2);//初始队列容量为2
for (int i = 0; i < 5; i++) {//生产编号0-4的消息,生产线程
int id = i;
new Thread(()->{
queue.productor(new Message(id,"message:"+id));//调用生产方法
}, "productor :"+i).start();//每个消息对应一个线程启动
}
new Thread(()->{//消费线程
while (true){//一直消费直至队列为空
try {
Thread.sleep(1000);
queue.consumer();//调用消费方法
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "consumer").start();//线程启动
}
}
测试结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)