多线程--生产者和消费者问题

问题:多线程中有一个比较经典的案例就是生产者和消费者问题.共同操作同一个资源,就是生成的产品,一个生产一个消费,这就必须考虑到线程的安全同步.如何实现多线程中的线程安全,保证资源的统一.

在生产者和消费者问题中,生产者和消费者都是多线程操作.
这里有一个执行生产者和消费者动作的对象,需要对产品有一个判断,判断何时进行生产何时进行消费

/**操作数据*/
class Product{
   
    int num;//产品的数量

    //让生产者生产,数量小于20就开始生产
    public synchronized void addProduct(){
   
        if (num>=20){
   //大于20就不用生产
            try {
   
                wait();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }else {
   
            num++;
            System.out.println("生产者开始生产第"+ num +"件产品");
            notifyAll();//产品数量大于0,可以唤醒当数量小于0时停止的消费线程
        }
    }
    //让消费者消费,只要数量大于0就可以开始消费
    //消费动作
    public synchronized void reduceProduct(){
   
        if (num>0){
   
            System.out.println("消费者开始消费第"+ num +"件产品");
            num--;
            notifyAll();//数量大于0表示可以开始消费,在产品数据为20的时候开始减少产品,然后生产者也可以开始生产,所以要唤醒生产者
        }else {
   
            try {
   
                wait();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }

        }
    }
}
生产者的执行代码:
/**生产者*/
class Producer implements Runnable{
   
    Product product;//引入要操作的对象
    public Producer(Product product) {
   
        this.product = product;
    }

    @Override
    public void run() {
   
            while (true){
   
                this.product.addProduct();
            }
    }
}

消费者的执行代码:

/**消费者*/
class Consumer implements Runnable{
   
    Product product;
    public Consumer(Product product) {
   
        this.product = product;
    }

    @Override
    public void run() {
   
        while (true){
   
            this.product.reduceProduct();
        }
    }


}

以上是以某机构尚**的思路来写的,以下是B站中的狂神的管程法(通过缓冲区来解决)

被共享的产品
/**产品*/
class Clicken{
   
    int id;//编号
    public Clicken(int id) {
   
        this.id = id;
    }
}

生产者的执行代码
/**生产者*/
class Productor extends Thread{
   

    SynContainer synContainer;
    public Productor(SynContainer synContainer){
   
        this.synContainer =synContainer;
    }

    @Override
    public void run
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值