java解决生产者与消费者的问题

思路分析

  • 当缓冲区(即仓库)已满时,生产者线程停止执行,放弃锁,使自己处于等待状态,让其他线程执行
  • 当缓冲区已空时,消费者线程停止执行,放弃锁,让其他线程执行
  • 当生产者向缓冲区放入一个产品时,向其他线程发出可执行的通知(唤醒其他线程),同时放弃锁,使自己处于等待状态
  • 当消费者从缓冲区中取出一个产品时,唤醒其他线程,放弃锁,使自己处于等待状态

代码实现

首先创建一个仓库类:包含生产和消费方法

/*首先创建一个仓库类*/
 public  class Warehouse {
    /*定义仓库容量*/
    private final int maxsize=10;
    /*创建仓库的载体*/
    private LinkedList<Object> list=new LinkedList<>();
    /*写一个生产产品的方法*/
    public void produce(){
        synchronized (list){
            while(list.size()>=maxsize){
                System.out.println("生产者"+Thread.currentThread().getName()+"仓库已满");
                try {
                    //释放当前锁
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            /*生产一个产品*/
            list.add(new Object());
            System.out.println("生产者"+Thread.currentThread().getName()+
                    "生产了一个产品,现库存"+list.size());
            // 向其他等待的线程发出可执行的通知
            list.notifyAll();
        }
    }
    /*写一个消费产品的方法*/
    public void consume(){
        synchronized (list){
            while (list.size()==0){
                System.out.println("消费者"+Thread.currentThread().getName()
                +"仓库为空");
                try {
                    //让消费者线程等待
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            /*消费一个产品*/
            list.remove();
            System.out.println("消费者"+Thread.currentThread().getName()+
                    "消费一个产品,现库存"+list.size());
            /*唤醒其他线程*/
            list.notifyAll();
        }
    }
}

然后创建一个生产者和消费者类

/*创建一个生产者类*/
class Producer implements Runnable{
  private Warehouse warehouse;//创建一个生产者对象

    public Producer(Warehouse warehouse) {
        this.warehouse = warehouse;
    }
    public Producer(){

}
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(1000);
                warehouse.produce();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
/*创建一个消费者类*/
class Consumer implements Runnable{
   private Warehouse warehouse;

    public Consumer(Warehouse warehouse) {
        this.warehouse = warehouse;
    }

    public Consumer() {
    }

    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(3000);
                warehouse.consume();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

最后测试

class Test1{
    public static void main(String[] args) {
        Warehouse warehouse=new Warehouse();
        Thread p1=new Thread(new Producer(warehouse));
        Thread p2=new Thread(new Producer(warehouse));
        Thread p3=new Thread(new Producer(warehouse));
        Thread c1=new Thread(new Consumer(warehouse));
        Thread c2=new Thread(new Consumer(warehouse));
        Thread c3=new Thread(new Consumer(warehouse));
        p1.start();
        p2.start();
        p3.start();
        c1.start();
        c2.start();
        c3.start();

    }
}

这是结果

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值