用wait、notify和ArrayBlockingQueue实现消息队列
实现思路

源代码
public class SharedQueue {
private int queueSize = 10;
private ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(queueSize);
class Producer extends Thread{
@Override
public void run() {
while (true){
synchronized(queue){
if(queue.size() >= queueSize){
System.out.println("current queue more than queueSize:10");
try {
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
queue.notify();
}
}else{
int num = queue.size()+1;
queue.add(num);
System.out.println("producer add one element,current queue size is:"+num);
queue.notify();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
class Consumer extends Thread{
@Override
public void run() {
while (true){
synchronized(queue){
if(queue.isEmpty()){
System.out.println("current queue is empty");
try {
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
queue.notify();
}
}else{
Integer poll = queue.poll();
System.out.println("consumer pull one element,current queue size is:"+poll);
queue.notify();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) {
SharedQueue sharedQueue = new SharedQueue();
SharedQueue.Consumer consumer = sharedQueue.new Consumer();
consumer.start();
for (int i = 0; i < 10; i++) {
SharedQueue.Producer producer = sharedQueue.new Producer();
producer.start();
}
}
}

浙公网安备 33010602011771号