Java作业第八章

   演示线程不考虑完全的逻辑问题。例如50=20+20+5+5或50=10+10+20+5等其他情况。。。本例子在判断50找零的时候,只判断了这两种情况,其他的就没考虑的。重在演示线程的过程。。。。

Code:
  1. package cc.nothing2012.blogServlet;   
  2.   
  3. import java.util.ArrayList;   

     

  4. import java.util.List;   
  5.   
  6. /*=======题目:模仿例8-10,设计5个人排队买票,并规定卖票规则和排队顺序==========*/  
  7.   
  8. /*  
  9.  * 模拟五个人排队买票,每人买1张票。售票员有1张20元和1张5元的钱,电影票一张5元。  
  10.  * 排队从头到尾的顺序是:关五十、林二十、余五、李十、杨五 
  11.  * 最后的买票顺序是:余五、李十、林二十、关五十、杨五  
  12.  */  
  13. public class ch8_4 {   
  14.     public static List<String> theResult = new ArrayList<String>(); // 存放最后买票先后的结果   
  15.   
  16.     public static void main(String[] args) {   
  17.         String[] sName = { "关五十""林二十""余五""李十""杨五" };   
  18.         Cinema c = new Cinema(sName);   
  19.         Thread[] theads = { new Thread(c), new Thread(c), new Thread(c),   
  20.                 new Thread(c), new Thread(c) };   
  21.         // for(int i=0;i<5;i++){ //初始化5个进程   
  22.         // theads[i]=new Thread(c);   
  23.         // }   
  24.         for (int i = 0; i < 5; i++) {   
  25.             theads[i].setName(sName[i]);   
  26.         }   
  27.         for (int i = 0; i < 5; i++) {   
  28.             theads[i].start();   
  29.         }   
  30.   
  31.         while (true) {// 将最后结果进行打印   
  32.             try {   
  33.                 Thread.sleep(1000);   
  34.             } catch (InterruptedException e) {   
  35.                 e.printStackTrace();   
  36.             }   
  37.             if (theResult != null) {   
  38.                 if (theResult.size() == 5) {   
  39.                     printMessage("最后买票先后的结果");   
  40.                     for (int i = 0; i < 5; i++) {   
  41.                         System.out.print(theResult.get(i) + "/t");   
  42.                     }   
  43.                     break;   
  44.                 }   
  45.             }   
  46.         }   
  47.     }   
  48.   
  49.     // 负责打印信息。   
  50.     public static void printMessage(Object o) {   
  51.         System.out.println(o);   
  52.     }   
  53. }   
  54.   
  55. // =======================   
  56. class Cinema implements Runnable {   
  57.     TicketSeller seller;   
  58.     String[] sName;   
  59.   
  60.     public Cinema(String[] sName) {   
  61.         seller = new TicketSeller();   
  62.         this.sName = sName;   
  63.     }   
  64.   
  65.     public void run() {   
  66.         if (Thread.currentThread().getName().equals(sName[0])) {   
  67.             seller.sellTicket(50);   
  68.         } else if (Thread.currentThread().getName().equals(sName[1])) {   
  69.             seller.sellTicket(20);   
  70.         } else if (Thread.currentThread().getName().equals(sName[2])) {   
  71.             seller.sellTicket(5);   
  72.         } else if (Thread.currentThread().getName().equals(sName[3])) {   
  73.             seller.sellTicket(10);   
  74.         } else if (Thread.currentThread().getName().equals(sName[4])) {   
  75.             seller.sellTicket(5);   
  76.         }   
  77.     }   
  78.   
  79. }   
  80.   
  81. // ============售票员卖票的操作==============   
  82. class TicketSeller {   
  83.     int fiveNumber = 1, tenNumber = 0, twentyNumber = 1, fiftyNumber = 0// 小票员现有5元和20元的钱各一张   
  84.   
  85.     public synchronized void sellTicket(int receiveMoney) {   
  86.         String sName = Thread.currentThread().getName();   
  87.         if (receiveMoney == 5) { // 票一张是5元,刚好5元就直接卖给他,不用找零了。   
  88.             fiveNumber += 1;   
  89.             ch8_4.printMessage(sName + "给小票员5元钱,小票员卖个" + sName + "一张票不用找赎");   
  90.             ch8_4.theResult.add(sName);   
  91.         } else if (receiveMoney == 10) {   
  92.             while (fiveNumber < 1) {   
  93.                 ch8_4.printMessage(sName + "给售票员10元");   
  94.                 ch8_4.printMessage("小票员请" + sName + "靠边等一会");   
  95.                 try {   
  96.                     wait();   
  97.                 } catch (InterruptedException e) {   
  98.                     e.printStackTrace();   
  99.                 }   
  100.                 ch8_4.printMessage(sName + "结束等待,继续买票");   
  101.             }   
  102.             // 有零钱了   
  103.             fiveNumber = fiveNumber - 1;   
  104.             tenNumber += 1;   
  105.             ch8_4.printMessage(sName + "给售票员10元钱,售票员卖给" + sName + "一张票,找赎5元");   
  106.             ch8_4.theResult.add(sName);   
  107.         } else if (receiveMoney == 20) {   
  108.             while (fiveNumber < 1 || tenNumber < 1) {   
  109.                 ch8_4.printMessage(sName + "给售票员20元/n售票员请" + sName + "靠边等一会儿");   
  110.                 try {   
  111.                     wait();   
  112.                 } catch (InterruptedException e) {   
  113.                     e.printStackTrace();   
  114.                 }   
  115.                 ch8_4.printMessage(sName + "结束等待,继续买票");   
  116.             }   
  117.             fiveNumber = fiveNumber - 1;   
  118.             tenNumber = tenNumber - 1;   
  119.             twentyNumber += 1;   
  120.             ch8_4.printMessage(sName + "给售票员20元钱,售票员卖给" + sName + "一张票,找零15元");   
  121.             ch8_4.theResult.add(sName);   
  122.         } else if (receiveMoney == 50) {   
  123.             String flag = "";   
  124.             // boolean isOK=true;   
  125.             while (true) {   
  126.                 if (fiveNumber > 0) { // 45块的组合有两种情况   
  127.                     if (twentyNumber == 2) {   
  128.                         flag = "2twenty";   
  129.                         break;   
  130.                         // isOK=false;   
  131.                     } else if (twentyNumber == 1 && tenNumber == 2) {   
  132.                         flag = "1twenty";   
  133.                         // isOK=false;   
  134.                         break;   
  135.                     }   
  136.                 }   
  137.                 ch8_4.printMessage(sName + "给售票员50元/n售票员请" + sName + "靠边等一会儿");   
  138.                 try {   
  139.                     wait();   
  140.                 } catch (InterruptedException e) {   
  141.                     e.printStackTrace();   
  142.                 }   
  143.                 ch8_4.printMessage(sName + "结束等待,继续买票");   
  144.             }   
  145.             if (flag.endsWith("2twenty")) {   
  146.                 fiveNumber -= 1;   
  147.                 twentyNumber = twentyNumber - 2;   
  148.                 fiftyNumber += 1;   
  149.             } else if (flag.equals("1twenty")) {   
  150.                 fiveNumber = fiveNumber - 1;   
  151.                 tenNumber = tenNumber - 2;   
  152.                 twentyNumber = twentyNumber - 1;   
  153.             }   
  154.             ch8_4.printMessage(sName + "给售票员50元钱,售票员卖给" + sName + "一张票,找零45元");   
  155.             ch8_4.theResult.add(sName);   
  156.         }   
  157.         notifyAll();   
  158.     }   
  159. }   

运行结果如下:

关五十给售票员50元
售票员请关五十靠边等一会儿
林二十给售票员20元
售票员请林二十靠边等一会儿
余五给小票员5元钱,小票员卖个余五一张票不用找赎
关五十结束等待,继续买票
关五十给售票员50元
售票员请关五十靠边等一会儿
林二十结束等待,继续买票
林二十给售票员20元
售票员请林二十靠边等一会儿
李十给售票员10元钱,售票员卖给李十一张票,找赎5元
关五十结束等待,继续买票
关五十给售票员50元
售票员请关五十靠边等一会儿
林二十结束等待,继续买票
林二十给售票员20元钱,售票员卖给林二十一张票,找零15元
关五十结束等待,继续买票
关五十给售票员50元
售票员请关五十靠边等一会儿
杨五给小票员5元钱,小票员卖个杨五一张票不用找赎
关五十结束等待,继续买票
关五十给售票员50元钱,售票员卖给关五十一张票,找零45元
最后最票先后的结果
余五 李十 林二十 杨五 关五十 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值