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个)