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

实现思路
0e1823ac2a7ad14d600d5e963e83f0b

源代码

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();
        }
    }
}
posted @ 2025-07-10 21:36  Charlie-Pang  阅读(8)  评论(0)    收藏  举报