package thread;
    public class Bank{
    
    
    
    
    
    
    
    private String name;
    
    
    
    public String getName() {
    
    
    
    
    return name;
    
    
    
    }
    
    
    public void setName(String name) {
    
    
    
    
    this.name = name;
    
    
    
    }
    
    
    public Bank(String name) {
    
    
    
    
    super();
    
    
    
    this.name = name;
    
    
    
    }
    
    
    // 一个账户有2000块钱
    
    
    
    static int money = 2000;
    
    
    
    
    
    
    // 柜台取钱的方法
    
    
    
    public void Counter(int money) {//每次取走的钱数
    
    
    
    Bank.money -= money;//取钱后总额减少
    
    
    
    
    
    
    }
    
    
    
    
    
    
    // ATM取钱的方法
    
    
    
    public void ATM(int money) {//每次取走的钱数
    
    
    
    Bank.money -= money;//取钱后总额减少
    
    
    
    }
    
    
    
    
    
    
    private static String[] shareObj = {“true”}; // 创建一个静态钥匙//可以任意定义
    
    static class PersonA extends Thread {
    
    
    
    
    // 创建银行对象
    
    Bank bank;
    
    //通过构造器传入银行对象,确保两个人进入的是一个银行
    
    public PersonA(Bank bank, String name) {
    
    
    
    
    super(name);
    
    
    
    this.bank = bank;
    
    
    
    }
    //重写run方法,在里面实现使用柜台取钱
    
    @Override
    
    public void run() {
    
    
    
    
    synchronized (shareObj) {// 这个很重要属于银行的取款号码,一个人完成下一个人才能使用柜台取款
    
    while (Bank.money >= 100) {
    
    
    
    
    int money = 100;
    
    bank.Counter(money);// 每次取100块
    
    System.out.println(this.getName()+”在”+bank.getName()+”取走了” +money + “还剩下” +(Bank.money));
    
    try {
    
    
    
    
    shareObj.wait();//柜台工作人员暂停服务!
    
    
    
    } catch (InterruptedException e) {
    
    
    
    
    e.printStackTrace();
    
    
    
    }
    
    if(Bank.money==0){
    
    
    
    
    
    
    System.err.println(“不好意思银行暂时没有现金了!”);
    
    
    
    
    
    break;
    
    
    
    }
    
    try {
    
    
    sleep(1000);//取完柜台工作人员休息1秒
    
    } catch (InterruptedException e) {
    
    
    e.printStackTrace();
    
    }
    
    }
    
    }
    
    }
    
    
    
    static class PersonB extends Thread{
    
    
    
    
    // 创建银行对象
    
    
    
    Bank bank;
    
    
    
    // 通过构造器传入银行对象,确保两个人进入的是一个银行
    
    
    
    public PersonB(Bank bank, String name) {
    
    
    
    
    super(name);
    
    
    
    this.bank = bank;
    
    
    
    }
    
    
    
    // 重写run方法,在里面实现使用柜台取钱
    
    
    
    @Override
    
    
    
    public void run() {
    
    
    
    
    
    
    synchronized (shareObj) {
    
    
    
    
    while (Bank.money >= 200) {
    
    
    
    
    
    
    int money = 200;
    
    
    
    bank.ATM(money);// 每次取200块
    
    
    
    System.out.println(this.getName()+”在”+bank.getName()+”取走了” + money + “还剩下” +(Bank.money));
    
    
    
    shareObj.notifyAll();
    
    
    
    
    
    
    if(Bank.money==0){
    
    
    
    
    
    
    System.err.println(this.getName()+”在”+bank.getName()+”把剩余的钱取完了!”);
    
    
    
    
    
    break;
    
    
    
    }
    
    
    
    try {
    
    
    
    
    sleep(1000);// ATM反应1秒
    
    
    
    } catch (InterruptedException e) {
    
    
    
    
    e.printStackTrace();
    
    
    
    }
    
    
    
    }
    
    
    
    }
    
    
    
    }
    
    
    
    }
    
    
    //三个人在银行取钱
    public static void main(String[] args) {
    
    
    
    
    //银行的柜台
    
    Bank bank1 = new Bank(“银行柜台”);
    
    //银行的取款机
    
    Bank bank2 = new Bank(“银行ATM机”);
    
    // 实例化三个人,在同一个银行取钱
    
    PersonA pA = new PersonA(bank1,”A”);
    
    PersonA PA2  = new PersonA(bank1,”B”);
    
    PersonB pB = new PersonB(bank2,”C”);
    //pA和PA2在柜台排队取钱:PB在ATM机取钱
    
    pA.start();
    
    PA2.start();
    
    pB.start();
    
    
    }
    
    
    
    }
    
    }
   
 
