线程实例模仿人在银行取钱

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();
         
     }
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值