三个生产者线程,一个消费者线程。
三个生产者线程将生产的Message放入到阻塞队列中,消费者线程从阻塞队列中获取值。
@Slf4j(topic = "c.mainTest")
public class MainTest {
public static void main(String[] args){
MessageQueue mq = new MessageQueue(2);
new Thread(()->{
while(true){
try {
Thread.sleep(1000);
mq.put(new Message(1,"值1"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"生产者1").start();
new Thread(()->{
while(true){
try {
Thread.sleep(1000);
mq.put(new Message(2,"值2"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"生产者2").start();
new Thread(()->{
while(true){
try {
Thread.sleep(1000);
mq.put(new Message(3,"值3"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"生产者3").start();
new Thread(()->{
while(true){
try {
Thread.sleep(300);
Message take = mq.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"消费者线程").start();
}
}
@Slf4j(topic = "c.messageQueue")
class MessageQueue {
//消息队列
private LinkedList<Message> list = new LinkedList<>();
//队列容量
private int capacity;
public MessageQueue(int capacity) {
this.capacity = capacity;
}
//获取消息
public Message take() {
synchronized (list) {
while (list.isEmpty()) {
try {
log.debug("队列空,消费者线程必须等待");
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//从队列的头部
list.notifyAll();
Message message = list.removeFirst();
log.debug("取出消息:"+message);
return message;
}
}
//存入消息
public void put(Message message) {
synchronized (list){
while(list.size()==capacity){
try {
log.debug("队列满,生产者线程必须等待");
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
log.debug("放入消息:"+message);
list.addLast(message);
list.notifyAll();
}
}
}
final class Message {
private int id;
private Object value;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Message{" +
"id=" + id +
", value=" + value +
'}';
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Message(int id, Object value) {
this.id = id;
this.value = value;
}
}