多线程编程实践——实现生产者消费者模型

Posted binye-typing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程编程实践——实现生产者消费者模型相关的知识,希望对你有一定的参考价值。

class Clerk {
  private int products;
  private int maximum;      // 最大储货量
  public Clerk(int maxmum) {
    this.maximum = maxmum;
  }
  public synchronized void addProduct() {
    if (products >= maximum) {
      try {
        wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    } else {
      products++;
      System.out.println(Thread.currentThread().getName() + "到货第 " + products + "个产品");
      notifyAll();
    }
  }
  public synchronized void saleProduct() {
    if (products > 0) {
      System.out.println(Thread.currentThread().getName() + "买走第 " + products + "个产品");
      products--;
      notifyAll();
    } else {
      try {
        wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

class Producer implements Runnable{
  private Clerk clerk;
  public Producer(Clerk clerk) {
    this.clerk = clerk;
  }
  public void run() {
    while (true) {
      clerk.addProduct();
      try {
        Thread.currentThread().sleep(1);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}
class Consumer implements Runnable {
  private Clerk clerk;
  public Consumer(Clerk clerk) {
    this.clerk = clerk;
  }
  public void run() {
    while (true) {
      clerk.saleProduct();
      try {
        Thread.currentThread().sleep(10);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

/**
 * Created by bruce on 2018/7/22.
 */
public class ProducerAndConsumer {
  public static void main(String[] args) {
    Clerk clerk = new Clerk(20);
    Thread t1 = new Thread(new Producer(clerk));
    Thread t2 = new Thread(new Consumer(clerk));
    Thread t3 = new Thread(new Consumer(clerk));
    Thread t4 = new Thread(new Consumer(clerk));
    t1.setName("生产者");
    t2.setName("消费者1");
    t3.setName("消费者2");
    t4.setName("消费者3");
    t1.start();
    t2.start();
    t3.start();
    t4.start();
  }
}

 

以上是关于多线程编程实践——实现生产者消费者模型的主要内容,如果未能解决你的问题,请参考以下文章

多线程生产者消费者模型

python 复习—并发编程实战——多线程和多进程的生产者消费者模型线程进程再总结

Java多线程:生产者消费者模型

生产者消费者模型实现多线程异步交互

Java实现多线程生产者消费模型及优化方案

LINUX多线程(生产者消费者模型,POXIS信号量)