该例未使用同步,有时总数不等于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());
}
}