在下面的程序中,如何使银行账户的转账次数限定为有限次数?因为此程序会一直运行。除非人为终止。代码如下:/**
 * 本例中用2种方法创建并启动线程
 * @author mk
 *
 */
public class UnsynchBank {
public static void main(String[] args){
Bank b=new Bank(NACCOUNTS,INITIAL_BALANCE);
for(int i=0;i<NACCOUNTS;i++){
//方法1:  TransferRunnable r=new TransferRunnable(b,i,INITIAL_BALANCE);
//       Thread t=new Thread(r);
ChildThread t=new ChildThread(b,i,INITIAL_BALANCE);//方法2
t.start();
}
}
private static final int NACCOUNTS=100;
private static final double INITIAL_BALANCE=1000;
}
public class ChildThread extends Thread{
public ChildThread(Bank b,int from,double max){
bank=b;
fromAccount=from;
maxAmount=max;
}
public void run(){
try{
while(true){
int toAccount=(int)(bank.size()*Math.random());
double amount=maxAmount*Math.random();
bank.transfer(fromAccount, toAccount, amount);
Thread.sleep((int)(DELAY*Math.random()));
}
}catch(InterruptedException e){

}
}
private Bank bank;
private double maxAmount;
private int fromAccount;
private int DELAY=10;}
public class Bank {
public Bank(int n,double initialBalance){
accounts=new double[n];
for(int i=0;i<accounts.length;i++){
accounts[i]=initialBalance;
}
}
public void transfer(int from,int to,double amount){
if(accounts[from]<amount)return;
accounts[from]-=amount;
accounts[to]+=amount;
System.out.println("Total Balance: "+getTotalBalance());
}
public double getTotalBalance(){
double sum=0;
for(double s:accounts){
sum+=s;
}
return sum;
}
public int size(){
return accounts.length;
}
private final double[] accounts;}

解决方案 »

  1.   

    UnsynchBank 类中,
    for(int i=0;i<NACCOUNTS;i++){
    将 NACCOUNTS 改为次数
      

  2.   

    for example//Bank类添加一个转账次数统计
    public class Bank {
        public Bank(int n,double initialBalance){
            accounts=new double[n];
            transferCount = new int[n];
            for(int i=0;i<accounts.length;i++){
                accounts[i]=initialBalance;
            }
        }
        public void transfer(int from,int to,double amount){
            if(accounts[from]<amount)return;
            accounts[from]-=amount;
            accounts[to]+=amount;
            System.out.println("Total Balance: "+getTotalBalance());
            transferCount[from]++; //转账次数累加
        }
        public double getTotalBalance(){
            double sum=0;
            for(double s:accounts){
                sum+=s;
            }
            return sum;
        }
        public int size(){
            return accounts.length;
        }    public int getTransgerCount(int accountId) {
            return transferCount[accountId];
        }
        private final double[] accounts;
        private final int[] transferCount;
        public static final int MAX_TRANSFER_COUNT = 50;}//线程中判断转账次数
    public class ChildThread extends Thread{
        public ChildThread(Bank b,int from,double max){
            bank=b;
            fromAccount=from;
            maxAmount=max;
        }
        public void run(){
            try{
                while(true){
                    //判断转账次数,大于转账次数则推出循环
                    if (fromAccount.getTransferCount() > Bank.MAX_TRANSFER_COUNT) {break;}
                    int toAccount=(int)(bank.size()*Math.random());
                    double amount=maxAmount*Math.random();
                    bank.transfer(fromAccount, toAccount, amount);
                    Thread.sleep((int)(DELAY*Math.random()));
                }
            }catch(InterruptedException e){
                
            }
        }
        private Bank bank;
        private double maxAmount;
        private int fromAccount;
        private int DELAY=10;}
      

  3.   

    失误,线程中
    while(true){
       //判断转账次数,大于转账次数则推出循环
       if (b.getTransferCount(fromAccount) > Bank.MAX_TRANSFER_COUNT) {break;}
      

  4.   

    顺便问一下,本例中的数组accounts的修饰符是final,final不是说它所修饰的变量时固定的值吗?但是accounts数组的内容是在不断变化着的,这该怎么理解?
      

  5.   

    数组本身是fianl,但是数组元素不是,也就是说
    final int[] a = {1,2,3};
    a = new int[]{4,5,6}; //这是不可以的,数组a本身不能改变
    a[0]=4; //这是可以的,数组元素可以改变