用BlockingQueue实现生产者消费者模式

public class TestMain {
    //定义一个阻塞队列
    static BlockingQueue<Object> queue = new ArrayBlockingQueue<>(10);
    static AtomicInteger producerNumber = new AtomicInteger(0);
    static AtomicInteger consumerNumber = new AtomicInteger(0);
    //定义一个标志位
    static boolean flag = true;

    //生产者线程
    static class Producer implements Runnable {
        @Override
        public void run() {
            while (flag) {
                try {
                    //生产消息
                    queue.put(new Object());
                    System.out.println(Thread.currentThread().getName() + "生产了第" + (producerNumber.incrementAndGet()) + "件商品");
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //消费者线程
    static class Consumer implements Runnable {
        @Override
        public void run() {
            while (flag) {
                try {
                    //消费者消费
                    queue.take();
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(Thread.currentThread().getName() + "消费了第" + (consumerNumber.incrementAndGet()) + "件商品");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        Thread producerThread = new Thread(new Producer(), "生存者线程");
        Thread consumerThread = new Thread(new Consumer(), "消费者线程");
        producerThread.start();
        consumerThread.start();
        //生产消费的行为只做5秒
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = false;
    }
}

运行结果如下:

在这里插入图片描述

总结

从运行结果来看,成功的使用BlockingQueue实现了生产者消费者模式。

原创文章 358 获赞 387 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105605480