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元
最后最票先后的结果
余五 李十 林二十 杨五 关五十 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值