码迷,mamicode.com
首页 > 编程语言 > 详细

多线程售票员卖票问题

时间:2021-04-23 12:20:53      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!