Java作业第八章

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

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

运行结果如下:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值