/**
* @version 1.20 1999-04-26
* @author Cay Horstmann
*/
public class UnsynchBankTest {
public static void main(String[] args) {
Bank b = new Bank(NACCOUNTS, INITIAL_BALANCE);
int i;
for (i = 0; i < NACCOUNTS; i++) {
TransferThread t = new TransferThread(b, i, INITIAL_BALANCE);
t.setPriority(Thread.NORM_PRIORITY + i % 2);
t.start();
}
}
public static final int NACCOUNTS = 10;
public static final int INITIAL_BALANCE = 10000;
}
class Bank {
public Bank(int n, int initialBalance) {
accounts = new int[n];
int i;
for (i = 0; i < accounts.length; i++)
accounts[i] = initialBalance;
ntransacts = 0;
}
public void transfer(int from, int to, int amount) {
if (accounts[from] < amount)
return;
accounts[from] -= amount;
accounts[to] += amount;
ntransacts++;
if (ntransacts % NTEST == 0)
test();
}
public void test() {
int sum = 0;
for (int i = 0; i < accounts.length; i++)
sum += accounts[i];
System.out.println("Transactions:" + ntransacts + " Sum: " + sum);
}
public int size() {
return accounts.length;
}
public static final int NTEST = 10000;
private int[] accounts;
private long ntransacts = 0;
}
class TransferThread extends Thread {
public TransferThread(Bank b, int from, int max) {
bank = b;
fromAccount = from;
maxAmount = max;
}
public void run() {
try {
while (!interrupted()) {
int toAccount = (int) (bank.size() * Math.random());
int amount = (int) (maxAmount * Math.random());
bank.transfer(fromAccount, toAccount, amount);
sleep(1);
}
} catch (InterruptedException e) {
}
}
private Bank bank;
private int fromAccount;
private int maxAmount;
}
|