新建一個Break類,表示食物數量。
public class Break { public static final int MAX = 10; //最多一次性煮十個面包 Stack<Integer> stack = new Stack<Integer>(); public static int food_count = 0; //統計食物的個數 //做面包 public synchronized void make_food(int number){ stack.push(number); food_count++; } //吃食物 public synchronized int eat_food(){ food_count--; return stack.pop(); }}在創建一個廚房類,為了制作食物或者是消耗食物,若食物沒有了,則消費者進入wait(),生產者開始制作食物,隨后喚醒等待的消費者。
public class Kitchen { PRivate Break food ; public static int people1_eatnumber = 0;//第一個人吃的面包數量 public static int people2_eatnumber = 0;//第二個人吃的面包數量 public static final int TOTOAL_NUM = 100;//總共做的面包數量 public static int icount = 1;//統計做過的面包數量 public Kitchen(Break food){ this.food = food; } //做面包的方法 public synchronized void make(){ if(food.food_count<10){//鍋是不是滿了 food.make_food(Kitchen.icount); System.out.println("做完了第"+Kitchen.icount+"個食物。"); Kitchen.icount++; notifyAll();//食物有了,找兩個人來吃面包 }else{ System.out.println("鍋已經裝滿,一次性裝十個,等待兩人吃食物。"); try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }//進入阻塞狀態,等待消費者喚醒 } } //吃面包的方法 public synchronized void eat(){ if(food.food_count>0){ int temp = food.eat_food();//吃掉面包的編號 System.out.println(Thread.currentThread().getName()+"吃掉了第"+temp+"個食物"); if(Thread.currentThread().getName().equals("一號")){ people1_eatnumber++; }else{ people2_eatnumber++; } notifyAll(); //喚醒繼續做面包 }else{ System.out.println("食物吃完了,等待重新烹飪。"); try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}下面進入消費者和生產者類的構造,傳遞給一個Kitchen對象,其中消費者調用Kitchen類中的吃方法。
public class consumer implements Runnable { Kitchen kitchen; public consumer(Kitchen kitchen){ this.kitchen = kitchen; } @Override public void run() { // TODO Auto-generated method stub while(true){ if(kitchen.icount>100&&Break.food_count<=0){ break; } try{ kitchen.eat(); Thread.sleep(100); }catch(Exception e){ e.printStackTrace(); } } }}然而生產者則是調用了Kitchen對象中的制作方法。
public class product implements Runnable { private Kitchen kitchen; public product(Kitchen kitchen){ this.kitchen = kitchen; } @Override public void run() { // TODO Auto-generated method stub while(true){ //結束這個線程 if(Kitchen.icount > 100){ break; } try{ kitchen.make(); Thread.sleep(100); }catch(Exception e){ e.printStackTrace(); } } System.out.println("廚房食物材料已經做完。"); }}下面開始寫主類,包括了main方法,啟動程序,創建一個test類,實現:
public class test { public static void main(String[] args){ Break brake = new Break(); Kitchen kitchen = new Kitchen(brake); product p = new product(kitchen); consumer c1 = new consumer(kitchen); consumer c2 = new consumer(kitchen); Thread food = new Thread(p,"食物"); Thread people1 = new Thread(c1,"一號"); Thread people2 = new Thread(c2,"二號"); food.start(); people1.start(); people2.start(); try{ food.join(); people1.join(); people2.join(); }catch(Exception e){ e.printStackTrace(); } System.out.println("一號吃了"+Kitchen.people1_eatnumber); System.out.println("二號吃了"+Kitchen.people2_eatnumber); }}輸出結果如下:
做完了第1個食物。二號吃掉了第1個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第2個食物。一號吃掉了第2個食物食物吃完了,等待重新烹飪。做完了第3個食物。一號吃掉了第3個食物食物吃完了,等待重新烹飪。做完了第4個食物。一號吃掉了第4個食物做完了第5個食物。二號吃掉了第5個食物食物吃完了,等待重新烹飪。做完了第6個食物。二號吃掉了第6個食物食物吃完了,等待重新烹飪。做完了第7個食物。二號吃掉了第7個食物做完了第8個食物。一號吃掉了第8個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第9個食物。一號吃掉了第9個食物食物吃完了,等待重新烹飪。做完了第10個食物。一號吃掉了第10個食物做完了第11個食物。二號吃掉了第11個食物食物吃完了,等待重新烹飪。做完了第12個食物。二號吃掉了第12個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第13個食物。一號吃掉了第13個食物做完了第14個食物。二號吃掉了第14個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第15個食物。一號吃掉了第15個食物做完了第16個食物。二號吃掉了第16個食物食物吃完了,等待重新烹飪。做完了第17個食物。二號吃掉了第17個食物食物吃完了,等待重新烹飪。做完了第18個食物。二號吃掉了第18個食物食物吃完了,等待重新烹飪。做完了第19個食物。二號吃掉了第19個食物食物吃完了,等待重新烹飪。做完了第20個食物。二號吃掉了第20個食物食物吃完了,等待重新烹飪。做完了第21個食物。二號吃掉了第21個食物食物吃完了,等待重新烹飪。做完了第22個食物。二號吃掉了第22個食物食物吃完了,等待重新烹飪。做完了第23個食物。二號吃掉了第23個食物食物吃完了,等待重新烹飪。做完了第24個食物。二號吃掉了第24個食物食物吃完了,等待重新烹飪。做完了第25個食物。二號吃掉了第25個食物食物吃完了,等待重新烹飪。做完了第26個食物。二號吃掉了第26個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第27個食物。一號吃掉了第27個食物食物吃完了,等待重新烹飪。做完了第28個食物。一號吃掉了第28個食物食物吃完了,等待重新烹飪。做完了第29個食物。一號吃掉了第29個食物做完了第30個食物。二號吃掉了第30個食物食物吃完了,等待重新烹飪。做完了第31個食物。二號吃掉了第31個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第32個食物。一號吃掉了第32個食物食物吃完了,等待重新烹飪。做完了第33個食物。一號吃掉了第33個食物食物吃完了,等待重新烹飪。做完了第34個食物。一號吃掉了第34個食物做完了第35個食物。二號吃掉了第35個食物食物吃完了,等待重新烹飪。做完了第36個食物。二號吃掉了第36個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第37個食物。一號吃掉了第37個食物食物吃完了,等待重新烹飪。做完了第38個食物。一號吃掉了第38個食物食物吃完了,等待重新烹飪。做完了第39個食物。一號吃掉了第39個食物做完了第40個食物。二號吃掉了第40個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第41個食物。一號吃掉了第41個食物做完了第42個食物。二號吃掉了第42個食物做完了第43個食物。二號吃掉了第43個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第44個食物。一號吃掉了第44個食物食物吃完了,等待重新烹飪。做完了第45個食物。一號吃掉了第45個食物做完了第46個食物。二號吃掉了第46個食物食物吃完了,等待重新烹飪。做完了第47個食物。二號吃掉了第47個食物食物吃完了,等待重新烹飪。做完了第48個食物。二號吃掉了第48個食物食物吃完了,等待重新烹飪。做完了第49個食物。二號吃掉了第49個食物食物吃完了,等待重新烹飪。做完了第50個食物。二號吃掉了第50個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第51個食物。一號吃掉了第51個食物食物吃完了,等待重新烹飪。做完了第52個食物。一號吃掉了第52個食物做完了第53個食物。二號吃掉了第53個食物做完了第54個食物。一號吃掉了第54個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第55個食物。做完了第56個食物。二號吃掉了第56個食物一號吃掉了第55個食物做完了第57個食物。一號吃掉了第57個食物食物吃完了,等待重新烹飪。做完了第58個食物。一號吃掉了第58個食物做完了第59個食物。二號吃掉了第59個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第60個食物。一號吃掉了第60個食物做完了第61個食物。二號吃掉了第61個食物食物吃完了,等待重新烹飪。做完了第62個食物。二號吃掉了第62個食物食物吃完了,等待重新烹飪。做完了第63個食物。二號吃掉了第63個食物食物吃完了,等待重新烹飪。做完了第64個食物。二號吃掉了第64個食物食物吃完了,等待重新烹飪。做完了第65個食物。二號吃掉了第65個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第66個食物。做完了第67個食物。二號吃掉了第67個食物一號吃掉了第66個食物做完了第68個食物。一號吃掉了第68個食物食物吃完了,等待重新烹飪。做完了第69個食物。一號吃掉了第69個食物食物吃完了,等待重新烹飪。做完了第70個食物。一號吃掉了第70個食物做完了第71個食物。二號吃掉了第71個食物食物吃完了,等待重新烹飪。做完了第72個食物。二號吃掉了第72個食物食物吃完了,等待重新烹飪。做完了第73個食物。二號吃掉了第73個食物食物吃完了,等待重新烹飪。食物吃完了,等待重新烹飪。做完了第74個食物。一號吃掉了第74個食物食物吃完了,等待重新烹飪。做完了第75個食物。一號吃掉了第75個食物做完了第76個食物。二號吃掉了第76個食物食物吃完了,等待重新烹飪。做完了第77個食物。二號吃掉了第77個食物食物吃完了,等待重新烹飪。做完了第78個食物。二號吃掉了第78個食物食物吃完了,等待重新烹飪。做完了第79個食物。二號吃掉了第79個食物食物吃完了,等待重新烹飪。做完了第80個食物。二號吃掉了第80個食物食物吃完了,等待重新烹飪。做完了第81個食物。二號吃掉了第81個食物食物吃完了,等待重新烹飪。做完了第82個食物。二號吃掉了第82個食物食物吃完了,等待重新烹飪。做完了第83個食物。二號吃掉了第83個食物食物吃完了,等待重新烹飪。做完了第84個食物。二號吃掉了第84個食物食物吃完了,等待重新烹飪。做完了第85個食物。二號吃掉了第85個食物食物吃完了,等待重新烹飪。做完了第86個食物。二號吃掉了第86個食物食物吃完了,等待重新烹飪。做完了第87個食物。二號吃掉了第87個食物食物吃完了,等待重新烹飪。做完了第88個食物。二號吃掉了第88個食物做完了第89個食物。二號吃掉了第89個食物食物吃完了,等待重新烹飪。做完了第90個食物。二號吃掉了第90個食物食物吃完了,等待重新烹飪。做完了第91個食物。二號吃掉了第91個食物食物吃完了,等待重新烹飪。做完了第92個食物。二號吃掉了第92個食物食物吃完了,等待重新烹飪。做完了第93個食物。二號吃掉了第93個食物食物吃完了,等待重新烹飪。做完了第94個食物。二號吃掉了第94個食物食物吃完了,等待重新烹飪。做完了第95個食物。二號吃掉了第95個食物食物吃完了,等待重新烹飪。做完了第96個食物。二號吃掉了第96個食物食物吃完了,等待重新烹飪。做完了第97個食物。二號吃掉了第97個食物食物吃完了,等待重新烹飪。做完了第98個食物。二號吃掉了第98個食物食物吃完了,等待重新烹飪。做完了第99個食物。二號吃掉了第99個食物食物吃完了,等待重新烹飪。做完了第100個食物。二號吃掉了第100個食物廚房食物材料已經做完。一號吃了33二號吃了67
新聞熱點
疑難解答