Thread线程之 多生产者与多消费者模拟生产消费

来源:互联网 发布:软件测试计划实例 编辑:程序博客网 时间:2024/05/16 07:09

Thread 线程经典示例之多生产者 多消费者

  1. 要求多个生产者进行生产 多个消费者进行消费
  2. 其间的生产和消费实现同步
  3. 如果库存超过20则生产等待消费继续
  4. 如果消费少于0则消费暂停生产继续

方法摘要

  • wait();不想要此线程进行暂时等待
  • notifyAll();通知此对象监视器上等待的所有线程
  • Thread.sleep();线程进行休眠指定时间数
代码实现如下

此模块实现主线程中创建两个生产者对象 两个消费者线程对象

public static void main(String[] args) {    Clerk cl = new Clerk();    //创建两个生产者对象并将产品对象作为其构造参数传入供线程调用    Producer pro = new Producer(cl);    Producer pro1 = new Producer(cl);    //创建两个消费者对象并将产品对象作为其构造参数传入供线程调用    Consumer con = new Consumer(cl);    Consumer con1 = new Consumer(cl);    //创建两个生产者线程对象并就绪    new Thread(pro,"生产者甲 ").start();    new Thread(pro1,"生产者甲 ").start();    //创建两个消费者线程对象并就绪    new Thread(con,"消费者A ").start();    new Thread(con1,"消费者B ").start();}

此代码快实现生产者线程
class Producer implements Runnable{

private Clerk clerk;public Producer(Clerk clerk){    this.clerk=clerk;}@Overridepublic void run() {    while(true){        //调用已经实现了同步的生产方法        clerk.addProduct();    }}}

此代码快实现消费者线程
class Consumer implements Runnable{

private Clerk clerk;public Consumer(Clerk clerk){    this.clerk=clerk;}@Overridepublic void run() {    while(true){        //调用已经实现了同步的消费方法        clerk.sellProduct();    }}}

此代码快实现产品类其中封装了同步的生产和消费方法

class Clerk{int product = 0;//产品的库存量/** * 供生产者生成产品使用 *  * 每次调用此方法,相当于 生产者生产 */public synchronized void  addProduct(){//默认锁对象 this(同步方法)    if (product>=20) {        //不需要继续生成,先等待        try {            wait();        } catch (InterruptedException e) {            e.printStackTrace();        }    } else {        //可以生成        try {            Thread.sleep(100);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println(Thread.currentThread().getName()+"生成了1个产品,目前库存是:"+(++product));        notifyAll();//唤醒 所有此对象监视器上的等待线程    }}/** * 供消费者消费产品使用 *  * 每次调用此方法,相当于 消费者消费 *  */public synchronized void  sellProduct(){//默认锁对象 this (同步方法)    if (product<=0) {//目前没有库存,先等待        try {            wait();        } catch (InterruptedException e) {            e.printStackTrace();        }    } else {        try {            Thread.sleep(100);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println(Thread.currentThread().getName()+"消费了1个产品,目前库存是:"+(--product));        notifyAll();//通知此对象监视器上等待的所有线程    }}}
0 0