Java作业第八章

本文通过线程模拟了五个人按特定顺序排队买票的过程,展示了如何使用Java实现线程间的同步与等待,确保售票员有足够的零钱找赎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

演示线程不考虑完全的逻辑问题。例如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元
最后最票先后的结果
余五李十林二十杨五关五十

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值