线程练习-吃包子

文章描述了一个使用Java实现的多线程场景,模拟包子铺的生产者-消费者模型,3个厨师线程负责生产包子,2个消费者线程负责吃包子,通过synchronized关键字保证并发控制。
摘要由CSDN通过智能技术生成

3个生产者线程,负责生产包子,每个线程每次只能生产1个包子放在桌子上      

2个消费者线程负责吃包子,每人每次只能从桌子上拿1个包子吃。

首先创建桌子类,在里面运行制作包子及吃包子的线程代码

package day12.baozi;

import java.util.ArrayList;
import java.util.List;

/*
   定义桌子类
       定义一个存储包子的集合 存储包子

       定义一个厨师生产包子的方法

       定义一个吃货吃包子的方法
 */
public class Desk {
    //  定义一个存储包子的集合 存储包子
    private List<String> list = new ArrayList<>();

    // 定义一个厨师生产包子的方法
    public synchronized void put()  {

        try{
            //获取厨师线程对象的名称
            String name = Thread.currentThread().getName();
            //判断有没有包子
            if(list.size()==0){//没有包子 厨师要做包子
                list.add(name+"做的包子..");//生产包子 把包子放到集合中
                System.out.println("厨师:"+name+"正在做包子.....");
                //模拟做包子的时间
                Thread.sleep(2000);
                //等待和唤醒方法 一般采用共享资源进行调用
                //包子做完了
                this.notifyAll();//唤醒所有的吃货
                this.wait();//厨师进入休息 等待
            }else {
                //this.notifyAll();//唤醒所有的吃货
                this.wait();//厨师进入休息 等待 因为桌子上有包子了。
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }


    }
    //定义一个 吃货 吃包子的方法
    public synchronized  void get() {

        try{
            //获取吃货的名称
            String name = Thread.currentThread().getName();
            //先判断有没有包子
            if(list.size()==1){
                //模拟吃包子
                System.out.println("吃货:"+name+"正在吃"+list.get(0));
                list.clear();//清空
                Thread.sleep(1500);
                //吃饭之后
                //唤醒厨师
                this.notifyAll();
                //吃货休息
                this.wait();

            }else {
                //唤醒厨师
                this.notifyAll();
                //吃货休息
                this.wait();
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}

创建运行类,在里面运行制作和吃的程序 

package day12.baozi;

public class QingFengBaoZiPu {

    public static void main(String[] args) {
        //开始准备吃包子
        System.out.println("进入包子铺 坐了下来 点餐");

        //创建共享资源
        Desk desk = new Desk();

        //有三个厨师  线程
        new Thread(()->{
            //厨师要生产包子
            while(true){
                desk.put();
            }
        },"张大厨").start();
        new Thread(()->{
            //厨师要生产包子
            while(true){
                desk.put();
            }
        },"李大厨").start();
        new Thread(()->{
            //厨师要生产包子
            while(true){
                desk.put();
            }
        },"王大厨").start();
        //有两个吃货 线程
        new Thread(()->{
            //吃货要次包子
            while(true){
                desk.get();
            }
        },"吃货A").start();
        new Thread(()->{
            //吃货要次包子
            while(true){
                desk.get();
            }
        },"吃货B").start();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值