java线程学习——汉堡销售问题

汉堡店中有一个负责做汉堡的厨师,一个负责销售的营业员,用java线程表示他们的营业过程:

问题原型就是生产者与消费者的问题。

首先定义一个汉堡包箱子类与几个相关的变量类:

1 public class Ham
2 {
3   static Object box=new Object();    //制作汉堡的箱子
4   static int totalMaterial=6;       //制作汉堡的材料的量(10个汉堡)
5   static int sales=0;               //汉堡包的销售量
6   static int production=3;          //汉堡包的产量,光顾之前有3个
7 }

再来定义厨师类:

 1 public class HMaker extends Thread {   //厨师类
 2      void make()                       //制作一个汉堡,通知营业员
 3      {
 4          synchronized(Ham.box)
 5          {
 6              Ham.production++;
 7              System.out.println("厨师:这里有汉堡!!(总"+Ham.production+"个)");
 8              Ham.box.notify();         //通知营业员
 9          }
10      }
11      public void run()
12      {
13          while(Ham.production<Ham.totalMaterial)  //不能超过材料数目
14          {
15              try
16              {
17                  sleep(3000);
18              }catch(InterruptedException ie){}
19              make();                             //制作一个汉堡
20          }
21      }
22 }

营业员类定义如下:

 1 public class HAssistant extends Thread{
 2     
 3     void sell()        //销售一个汉堡
 4     {
 5         synchronized(Ham.box)
 6         {
 7             if(Ham.production==Ham.sales)
 8             {
 9                 try{
10                 Ham.box.wait();           //没有汉堡了唤醒厨师
11                 }catch(InterruptedException ie){}
12             }
13             Ham.sales++;
14             System.out.println("营业员:顾客朋友们,汉堡上来了.(总"+Ham.sales+"个)");
15         }
16     }
17     public void run()
18     {
19         while(Ham.sales<Ham.totalMaterial)
20         {
21             System.out.println("<顾客订购汉堡.>");
22             sell();                            //销售汉堡
23             try{
24                 sleep(1000);
25             }catch(InterruptedException ie){}
26         }
27     }
28 }

主程序如下:

1 public class Synchronization6 {
2     public static void main(String[] args) {
3         HMaker maker=new HMaker();
4         HAssistant assistant=new HAssistant();
5         maker.start();
6         assistant.start();
7     }
8 }

运行结果:

<顾客订购汉堡.>
营业员:顾客朋友们,汉堡上来了.(总1个)
<顾客订购汉堡.>
营业员:顾客朋友们,汉堡上来了.(总2个)
<顾客订购汉堡.>
营业员:顾客朋友们,汉堡上来了.(总3个)
<顾客订购汉堡.>
厨师:这里有汉堡!!(总4个)
营业员:顾客朋友们,汉堡上来了.(总4个)
<顾客订购汉堡.>
厨师:这里有汉堡!!(总5个)
营业员:顾客朋友们,汉堡上来了.(总5个)
<顾客订购汉堡.>
厨师:这里有汉堡!!(总6个)
营业员:顾客朋友们,汉堡上来了.(总6个)

原文地址:https://www.cnblogs.com/sunrunzhi/p/3418974.html