package v1ch10.synch;

/**
 * This program shows how multiple threads can safely access a data structure.
 */
class SynchBankDemo {
    final int NACCOUNTS = 100;
    final double INITIAL_BALANCE = 1000;
    final double MAX_AMOUNT = 1000;
    final int DELAY = 10;

    void main() {
        var bank = new Bank(NACCOUNTS, INITIAL_BALANCE);
        for (int i = 0; i < NACCOUNTS; i++) {
            int fromAccount = i;
            Runnable r = () -> {
                try {
                    while (true) {
                        int toAccount = (int) (bank.size() * Math.random());
                        double amount = MAX_AMOUNT * Math.random();
                        bank.transfer(fromAccount, toAccount, amount);
                        Thread.sleep((int) (DELAY * Math.random()));
                    }
                }
                catch (InterruptedException e) {
                }
            };
            Thread.ofPlatform().start(r);
        }
    }
}
