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

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;
}
@Override
public void run() {

    while(true){
        //调用已经实现了同步的生产方法
        clerk.addProduct();

    }
}
}

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

private Clerk clerk;

public Consumer(Clerk clerk){
    this.clerk=clerk;
}

@Override
public 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();//通知此对象监视器上等待的所有线程
    }
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值