在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的。在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻塞队列,这里最好使用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”),使用阻塞队列代码要简单得多,不需要再单独考虑同步和线程间通信的问题。所以在实际开发中,一般符合生产者消费者模式的问题都推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。