代码改变世界

生产者消费者模式

2018-10-08 19:02  东风恶  阅读(261)  评论(0编辑  收藏  举报

生产者、消费者有很多的实现方法: 
- 用wait() / notify()方法 
- 用Lock的多Condition方法 
- BlockingQueue阻塞队列方法

可以发现在上面实现阻塞队列题中,BlockingQueue的实现基本都用到了类似的实现,将BlockingQueue的实现方式稍微包装一下就成了一个生产者-消费者模式了。 

  1. //用阻塞队列快速实现生产者-消费者
  2. public class ProduceAndConsumer {
  3.  public static void main(String[] args) {
  4.  final BlockingQueue<Integer> list = new ArrayBlockingQueue<Integer>(10);
  5.  Procude procude = new Procude(list);
  6.  Consumer consumer = new Consumer(list);
  7.  procude.start();
  8.  consumer.start();
  9.  }
  10. static class Procude extends Thread{
  11.  private final BlockingQueue<Integer> list;
  12.  Procude(BlockingQueue<Integer> list) {
  13.  this.list = list;
  14.  }
  15.  @Override
  16. public void run() {
  17.  while(true){
  18.  try {
  19.  Integer take = list.take();
  20.  System.out.println("消费数据:" + take);
  21.  // Thread.sleep(1000);
  22.  } catch (InterruptedException e) {
  23.  e.printStackTrace();
  24.  }
  25.  }
  26.  }
  27.  }
  28.   
  29.  static class Consumer extends Thread{
  30.  private final BlockingQueue<Integer> list;
  31.  Consumer(BlockingQueue<Integer> list) {
  32.  this.list = list;
  33.  }
  34.  @Override public void run() {
  35.  while (true){
  36.  try {
  37.  int i = new Random().nextInt(100);
  38.  list.put(i);
  39.  System.out.println("生产数据:" + i);
  40.  Thread.sleep(1000);
  41.  } catch (InterruptedException e) {
  42.  e.printStackTrace();
  43.  }

此处不再详细地写另外几种实现方式了:wait() / notify()方法、Lock的多Condition方法、信号量等,甚至可以考虑用CyclicBarrier、CountDownLatch也可以实现生产者-消费者的,难易程度、效率不一样罢了。