想要手写一个消息队列,我们首先要知道消息队列是一个什么东西,我们要做的事情是什么。
由于笔者要做的是一个面对小白的科普,就不用专业的术语去说明;消息队列实际上就是一个管子,不过这个管子是一个单向的,只能从一个方向去向管子内放东西,另一侧去拿东西,这样的一个管子,我们称之为,消息队列。
向管子内放东西的人称为生产者,他将生产的东西放到管子里面,同时这个管子只能串行的存放一行东西,接收方每次只能拿出来一个,这个接收方称位消费者。
static class MessageQueue{
int capacity;
LinkedList<Integer> list = new LinkedList<>();
public MessageQueue(int capacity){
this.capacity = capacity;
}
public int take() throws InterruptedException {
synchronized (list){
if(list.isEmpty()){
System.out.println("队列空了,取不出来,需要等待");
list.wait();
}
int res = list.removeFirst();
list.notifyAll();
return res;
}
}
public void put(int message) throws InterruptedException {
synchronized (list){
if(capacity == list.size()){
System.out.println("队列满了,不能添加,需要等待");
list.wait();
}
list.add(message);
list.notifyAll();
}
}
}
下面是测试代码
public static void main(String[] args) {
MessageQueue messageQueue = new MessageQueue(2);
for(int i = 0;i < 3;i++){
new Thread(()->{
try {
messageQueue.put(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
new Thread(()->{
while(true){
try {
sleep(1000);
int cur = messageQueue.take();
System.out.println(cur);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}