JAVA 多线程实现包子铺(买包子,吃包子)

Posted ssinoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 多线程实现包子铺(买包子,吃包子)相关的知识,希望对你有一定的参考价值。

 1 package baozi;
 2 
 3 /*
 4     生产者(包子铺)类:是一个 线程类,继承Thread
 5     设置线程任务(run):生产包子
 6     对包子 进行判断
 7     true:有包子
 8         包子铺调用wait方法进入等待状态
 9      false : 没有包子
10         包子铺生产包子
11         交替生产两种包子
12             有两种状态(i%2==0)
13          包子铺生产两种包子
14          修改包子的状态为true有
15          唤醒吃货线程,让吃货线程吃包子
16 
17      注意:
18         包子铺线程和包子线程关系-->通信(互斥)
19         锁对象必须保证唯一,可以使用包子对象作为锁对象
20         包子铺类和吃货的类 就需要把保安资质对象作为参数传递进来
21             1,需要在成员位子创建一个包子变量
22             2,使用带参数构造方法。为这个包子变量赋值
23 
24  */
25 public class BaoZIPu extends Thread 
26     private BaoZi bz;
27 
28     public BaoZIPu(BaoZi bz)
29         this.bz=bz;
30     
31 
32     @Override
33     public void run() 
34         int count = 0;
35         while (true) 
36             //同步技术
37             synchronized (bz) 
38                 //判断有没有包子
39                 if (bz.flag == true) 
40                     //包子铺调用wait反法进入等待状态
41                     try 
42                         bz.wait();
43                      catch (InterruptedException e) 
44                         e.printStackTrace();
45                     
46                 
47                 //被唤醒之后执行,包子铺生产包子
48                 //生产两种包子
49                 if (count % 2 == 0) 
50                     bz.pi = "薄皮";
51                     bz.xian = "猪肉";
52                  else 
53                     bz.pi = "厚皮";
54                     bz.xian = "牛肉";
55                 
56                 count++;
57                 System.out.println("包子铺正在生产" + bz.pi + bz.xian + "的包子");
58                 try 
59                     Thread.sleep(1000);
60                  catch (InterruptedException e) 
61                     e.printStackTrace();
62                 
63                 //包子铺生产好了包子
64                 //修改包子的状态为true
65                 bz.flag = true;
66                 //唤醒吃货线程,让吃货线程吃包子
67                 bz.notify();
68                 System.out.println("包子铺已经生产好了" + bz.pi + bz.xian + "的包子,吃货可以开始吃了");
69             
70         
71     
72 
 1 package baozi;
 2 
 3 /*
 4     设置包子的属性
 5  6  7         包子的状态:有 true 没有 false
 8  */
 9 public class BaoZi 
10     String pi;
11     String xian ;
12     //包子的状态 有 true 没有 fasle
13     boolean flag =false;
14 
 1 package baozi;
 2 
 3 import baozi.BaoZi;
 4 
 5 public class ChiHuo extends  Thread 
 6     private BaoZi bz;
 7     public  ChiHuo(BaoZi bz)
 8         this.bz=bz;
 9     
10     @Override
11     public void run() 
12         while(true)
13             synchronized (bz)
14                 if (bz.flag==false)
15                     try 
16                         bz.wait();
17                      catch (InterruptedException e) 
18                         e.printStackTrace();
19                     
20                 
21                 //被唤醒后执行的代码 ,吃包子
22                 System.out.println("吃货正在吃"+bz.pi+bz.xian+"的包子");
23                 bz.flag=false;
24                 bz.notify();
25                 System.out.println("吃货已经把"+bz.pi+bz.xian+"的包子出完了,包子铺开始生产包子 ");
26                 System.out.println("++++++++++++++");
27             
28         
29     
30 
 1 package baozi;
 2 
 3 import baozi.BaoZIPu;
 4 import baozi.BaoZi;
 5 import baozi.ChiHuo;
 6 
 7 public class Main 
 8     public static void main(String[] args) 
 9         BaoZi bz = new BaoZi();
10         //创建包子铺线程,开始生产包子
11         new BaoZIPu(bz).start();
12         //创建吃货线程,开启,吃包子
13         new ChiHuo(bz).start();
14     
15 
16 

运行代码??

技术图片

 

以上是关于JAVA 多线程实现包子铺(买包子,吃包子)的主要内容,如果未能解决你的问题,请参考以下文章

zm吃包子

queue队列吃包子

Python3,早知道3行代码就能提取音频,我把这10块钱买包子吃不香吗?

初识python: 生成器并行(做包子,吃包子)

python多线程异步 简单小栗子(包子大战)

买卖包子案例——等待唤醒机制