java多线程,模拟面包店制作面包(消费者,生产者)--两种不同的方式实现

文章描述了一个使用Java实现的多线程场景,模拟面包店的生产者(师傅)和消费者(顾客)模型,通过`synchronized`关键字保证了并发过程中的线程安全,展示了如何使用集合(LinkedList)存储并管理面包库存。
摘要由CSDN通过智能技术生成

假设柜台最多放10个面包,顾客买面包,没有面包--等待,师傅制作面包-唤醒


//柜台
class Dask {
    private int breadNumber = 0;

    //做面包
    public synchronized void makeBread() throws InterruptedException {
        if (breadNumber >= 10) {
            System.out.println(Thread.currentThread().getName() + "柜台面包满了。休息一会");
            wait();
        } else {
            breadNumber++;
            System.out.println(Thread.currentThread().getName() + "做了一个面包,柜台已经有" + breadNumber + "个面包");
            notifyAll();
        }

    }

    //买面包
    public synchronized void buyBread() throws InterruptedException {
        if (breadNumber == 0) {
            System.out.println(Thread.currentThread().getName() + "面包买完了,请你稍等一下");
            wait();
        } else {
            breadNumber--;
            System.out.println(Thread.currentThread().getName() + "买了一个面包,还剩" + breadNumber + "个面包");
            notifyAll();
        }

    }
}

//做面包的师傅
class Master implements Runnable {
    private Dask dask;

    public Master(Dask dask) {
        this.dask = dask;
    }

    @Override
    public void run() {
        while (true) {
            try {
                dask.makeBread();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

//买面包的顾客
class Customers implements Runnable {
    private Dask dask;

    public Customers(Dask dask) {
        this.dask = dask;
    }

    @Override
    public void run() {
        while (true) {
            try {
                dask.buyBread();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }
}

public class Dome1 {
    public static void main(String[] args) {
        Dask dask = new Dask();

        Master master = new Master(dask);
        Thread master1 = new Thread(master, "厨师1");
        Thread master2 = new Thread(master, "厨师2");
        Thread master3 = new Thread(master, "厨师3");
        Thread master4 = new Thread(master, "厨师4");
        Thread master5 = new Thread(master, "厨师5");

        Customers customer = new Customers(dask);
        Thread customer1 = new Thread(customer, "顾客-1");
        Thread customer2 = new Thread(customer, "顾客-2");
        Thread customer3 = new Thread(customer, "顾客-3");
        Thread customer4 = new Thread(customer, "顾客-4");
        Thread customer5 = new Thread(customer, "顾客-5");

        master1.start();
        master2.start();
        master3.start();
        master4.start();
        master5.start();

        customer1.start();
        customer2.start();
        customer3.start();
        customer4.start();
        customer5.start();
    }
}

集合存储面包方法


import java.util.LinkedList;
//蛋糕店
class BreadShop {
}

class DaskBread {
    //创建一个集合存储面包
    private LinkedList<BreadShop> list = new LinkedList<>();

    //做面包
    public synchronized void makeBread() throws InterruptedException {
        if (list.size() >= 10) {
            System.out.println(Thread.currentThread().getName() + "柜台面包已经满了,你可以休息一会");
            wait();
        } else {
            list.add(new BreadShop());
            System.out.println(Thread.currentThread().getName() + "做了一个面包,柜台已经有" + list.size() + "个面包");
            notifyAll();
        }
    }

    //买面包
    public synchronized void sellBread() throws InterruptedException {
        if (list.size() == 0) {
            System.out.println(Thread.currentThread().getName() + "面包已经卖光光了,请稍等!");
            wait();
        } else {
            list.removeFirst();
            System.out.println(Thread.currentThread().getName() + "买了一个面包,柜台还剩" + list.size() + "个面包");
            notifyAll();
        }
    }
}

//面包店
class Bread extends Thread {
    DaskBread daskBread;

    public Bread(String name, DaskBread daskBread) {
        super(name);
        this.daskBread = daskBread;
    }

    @Override
    public void run() {
        while (true) {
            try {
                daskBread.makeBread();
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

//顾客
class Customer extends Thread {
    DaskBread daskBread;

    public Customer(String name, DaskBread daskBread) {
        super(name);
        this.daskBread = daskBread;
    }

    @Override
    public void run() {
        while (true) {
            try {
                daskBread.sellBread();
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }
}

public class Work2 {
    public static void main(String[] args) {
        DaskBread daskBread = new DaskBread();
        //假设有两个面包师傅
        Bread bread1 = new Bread("师傅1", daskBread);
        Bread bread2 = new Bread("师傅2", daskBread);
        Bread bread3 = new Bread("师傅3", daskBread);
        Bread bread4 = new Bread("师傅4", daskBread);
        Bread bread5 = new Bread("师傅5", daskBread);
        //假设有六个顾客
        Customer customer1 = new Customer("顾客-1", daskBread);
        Customer customer2 = new Customer("顾客-2", daskBread);
        Customer customer3 = new Customer("顾客-3", daskBread);
        Customer customer4 = new Customer("顾客-4", daskBread);
        Customer customer5 = new Customer("顾客-5", daskBread);
        Customer customer6 = new Customer("顾客-6", daskBread);

        bread1.start();
        bread2.start();
        bread3.start();
        bread4.start();
        bread5.start();

        customer1.start();
        customer2.start();
        customer3.start();
        customer4.start();
        customer5.start();
        customer6.start();
    }
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaGgIeOo0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值