Java多线程_生产者消费者模式2

在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的。在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻塞队列,这里最好使用LinkedBlockingQueue

下面请看代码:

import java.util.concurrent.LinkedBlockingQueue;

public class BlockingQueueDemo {
    int size = 10;
    LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(size);

    public static void main(String[] args) {
        BlockingQueueDemo bqd = new BlockingQueueDemo();
        Consumer c = bqd.new Consumer();
        Productor p = bqd.new Productor();
        c.setName("消费者");
        p.setName("生产者");
        c.start();
        p.start();
    }

    class Consumer extends Thread {

        @Override
        public void run() {
            consume();
        }

        private void consume() {
            while (true) {
                try {
                    queue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "消费了一个物品,还有" + queue.size() + "个物品");
            }
        }
    }

    class Productor extends Thread {

        @Override
        public void run() {
            product();
        }

        private void product() {
            while (true) {
                try {
                    queue.put(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "生产了一个物品,现有" + queue.size() + "个物品");
            }

        }

    }
}

结果输出:

总结一下:

经过与传统的生产者消费者模式相比较(可以看我前面的博客“多线程_生产者消费者模式1”),使用阻塞队列代码要简单得多,不需要再单独考虑同步和线程间通信的问题。所以在实际开发中,一般符合生产者消费者模式的问题都推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。

posted @ 2019-01-17 17:59  橘子洲头。  阅读(224)  评论(0编辑  收藏  举报