public static void awardBonusExternal() {
        class AwardBonus extends RecursiveAction {

            public AwardBonus(ArrayList<BankAccount> accounts, int start, int end) {
                this.accounts = accounts;
                this.start = start;
                this.end = end;
            }

            private ArrayList<BankAccount> accounts;
            private final int start, end;

            private void awardBonus() {
                BigInteger bonusReduction = BigInteger.valueOf(100);
                for (int i=start; i<end; i++) {
                    BankAccount currentAccount = accounts.get(i);
                    if (currentAccount.getBalance().signum() > 0)
                        currentAccount.deposit(currentAccount.getBalance().divide(bonusReduction));
                }
            }

            @Override
            protected void compute() {
                // Better use Runtime.getRuntime().availableProcessors()
                if (end-start < 10)
                     awardBonus();
                else {
                    invokeAll(new AwardBonus(accounts,start,(start+end)/2),
                              new AwardBonus(accounts,(start+end)/2,end));
                }
            }
        }

        ForkJoinPool pool = new ForkJoinPool();
        ArrayList<BankAccount> accountsList = new ArrayList<>(christmasBank.getAllAccounts());
        pool.invoke(new AwardBonus(accountsList,0,accountsList.size()));

        System.out.print("Balances of all accounts (ext): ");
        for (BankAccount account: accountsList)
            System.out.print(" " + account.getBalance());
        System.out.println();

    }