标签:start stat his 唤醒 trace 创建 其他 style while
要求:
1、 假设现在有一个售票员进行售票,票价为5元,初始状态:票数不限,票售员手中有1张10元钱;
2、 每来一个顾客买票,相当于是创建一个线程,注意,此时顾客共享的资源是售票员及其手中的钱;
3、 当一个顾客到达后相当于创建一个线程,创建该线程时有两个参数,一是线程名,也就是顾客的名字,二是顾客带的钱(规定顾客带的钱只能为5元,10元,20元和50元)。
4、 某一个顾客买票时,如果售票员无法找零,则让该顾客等待,如果某一个顾客买票成功,则唤醒所有等待的顾客。
5、 主线程中用一个死循环来实现持续售票,可提供选择,是继续售票还是终止。
售票员售票,票价5元一张,假设只有5元,10元,20元,50元和100元五种币种,售票员手上有若干钱(自己初始化),顾客会拿这一张(5元,10元,20元,50元中的一张)钱来购票,设计一个算法,根据售票员手上的钱和顾客拿的钱判断是否可以售票?
售票员类主要实现:
1 2 3 public class Conduter implements Runnable { 4 private int[] money; //售货员的余额 5 private int tickets; //票数 6 7 8 Conduter(){ 9 money=new int[5]; 10 tickets=10; 11 money[1]++; 12 } 13 14 public boolean buyTickets(int a) { //实现找钱并更新money数组 15 if(a==5) { 16 synchronized(this) { 17 money[0]++; 18 tickets--; 19 } 20 return true; 21 }else { 22 int j=0; 23 switch (a) { 24 case 5: 25 j=0; 26 break; 27 case 10: 28 j=1; 29 break; 30 case 20: 31 j=2; 32 break; 33 case 50: 34 j=3; 35 break; 36 case 100: 37 j=4; 38 break; 39 } 40 a-=5; 41 int count_50=0; 42 while(a>=50&&(count_50<money[3])) { 43 a-=50; 44 count_50++; 45 } 46 int count_20=0; 47 while(a>=20&&(count_20<money[2])) { 48 a-=20; 49 count_20++; 50 } 51 int count_10=0; 52 while(a>=10&&(count_10<money[1])) { 53 a-=10; 54 count_10++; 55 } 56 int count_5=0; 57 while(a>=5&&(count_5<money[0])) { 58 a-=5; 59 count_5++; 60 } 61 if(a==0) { //如果能找开则用同步防止其他进程也在更改money数组 62 synchronized (this) { 63 money[j]++; 64 money[3]-=count_50; 65 money[2]-=count_20; 66 money[1]-=count_10; 67 money[0]-=count_5; 68 tickets--; 69 } 70 return true; 71 }else { 72 return false; 73 } 74 } 75 76 } 77 78 public void run() { 79 String []a=Thread.currentThread().getName().split("-"); //通过字符串分割来获得顾客给的钱。 80 int money=Integer.parseInt(a[2]); 81 synchronized (this) { 82 while(!buyTickets(money)){ 83 try { 84 System.out.println(Thread.currentThread().getName()+"开始等待"); 85 this.wait(); 86 }catch(InterruptedException e) { 87 e.printStackTrace(); 88 } 89 System.out.println(Thread.currentThread().getName()+"已被唤醒"); 90 } 91 System.out.println(Thread.currentThread().getName()+"购买完成"); 92 display(); 93 this.notifyAll(); 94 } 95 } 96 97 public void display() { 98 System.out.println("5:"+money[0]+" "+"10:"+money[1]+" "+"20:"+money[2]+" "+"50:"+money[3]+" "+"tickets:"+tickets); 99 } 100 }
主函数:
import java.util.Scanner; public class test { public static void main(String[] args) { Conduter con=new Conduter(); int count=0; while(true) { boolean a; Scanner scan=new Scanner(System.in); System.out.println("是否要继续买票"); a=scan.nextBoolean(); if(a) { int money=0; System.out.println("请输入给的钱数"); money=scan.nextInt(); count++; String name="顾客-"+count+"-"+money; new Thread(con,name).start(); }else { break; } } } }
注意:notify notifyall wait是对一个对象的多个线程来进行操作。
标签:start stat his 唤醒 trace 创建 其他 style while
原文地址:https://www.cnblogs.com/Haemos/p/14691879.html