多线程银行转账问题

该例未使用同步,有时总数不等于20。

使用sleep的原因是不知道怎么写等待所有线程执行完后再执行主方法,有知道的请在评论里告知下,谢谢。

public class Bank {
    
    private int AccoutAmout;
    private String AccoutName;
    
    public Bank(String name ,int AccoutAmout){
        this.AccoutName = name;
        this.AccoutAmout = AccoutAmout;
    }
    
    public int getAccoutAmout() {
        return AccoutAmout;
    }
    public void setAccoutAmout(int accoutAmout) {
        AccoutAmout = accoutAmout;
    }
    public String getAccoutName() {
        return AccoutName;
    }
    public void setAccoutName(String accoutName) {
        AccoutName = accoutName;
    }
}
 

public class BankTransfer implements Runnable{
    private Bank frombank;
    private Bank tobank;
    private int transamout;
    public BankTransfer(Bank frombank,Bank tobank,int transamout){
        this.frombank = frombank;
        this.tobank = tobank;
        this.transamout = transamout;
    }
    
    public void transfer(Bank tobank,int transamout){
        while((frombank.getAccoutAmout() - transamout)>=0){
            frombank.setAccoutAmout(frombank.getAccoutAmout() - transamout);
            tobank.setAccoutAmout(tobank.getAccoutAmout() + transamout);
            //System.out.println("============================== \n from "+frombank.getAccoutName() +" transfer " +transamout+" to "+tobank.getAccoutName() +"\n"+frombank.getAccoutName()+" now has "+frombank.getAccoutAmout() +" && " +tobank.getAccoutName()+" now has "+tobank.getAccoutAmout()+"\n"+"==============================");
        }
        
            System.out.println(frombank.getAccoutName()+" now has not enough money "+tobank.getAccoutName()+ " has "+tobank.getAccoutAmout() );
            
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        transfer(tobank,transamout);
    }
    
}
 

public class Transfer {


    public static void main(String[] args) throws InterruptedException{
        
        Bank a = new Bank("a",5);
        Bank b = new Bank("b",5);
        Bank c = new Bank("c",5);
        Bank d = new Bank("d",5);
        
        
        BankTransfer a2b = new BankTransfer(a,b,1);
        BankTransfer b2c = new BankTransfer(b,c,2);
        BankTransfer c2d = new BankTransfer(c,d,3);
        BankTransfer d2a = new BankTransfer(d,a,4);
        Thread t1 = new Thread(a2b);
        Thread t2 = new Thread(b2c);
        Thread t3 = new Thread(c2d);
        Thread t4 = new Thread(d2a);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        Thread.sleep(2000);
        System.out.println(a.getAccoutName()+" has "+a.getAccoutAmout());
        System.out.println(b.getAccoutName()+" has "+b.getAccoutAmout());
        System.out.println(c.getAccoutName()+" has "+c.getAccoutAmout());
        System.out.println(d.getAccoutName()+" has "+d.getAccoutAmout());
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值