30.8 (Account synchronization) Rewrite Listing 30.6, ThreadCooperation.java,
using the object’s wait() and notifyAll() methods.
using the object’s wait() and notifyAll() methods.
import java.util.concurrent.*; public class Exercise08 { private static Account account = new Account(); public static void main(String[] args) { // Create a thread pool with two threads ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(new DepositTask()); executor.execute(new WithdrawTask()); executor.shutdown(); System.out.println("Thread 1\t\tThread 2\t\tBalance"); } public static class DepositTask implements Runnable { @Override // Keep adding an amount to the account public void run() { try { // Purposely delay it to let the withdraw method proceed while (true) { account.deposit((int) (Math.random() * 10) + 1); Thread.sleep(1000); } } catch (InterruptedException ex) { ex.printStackTrace(); } } } public static class WithdrawTask implements Runnable { @Override // Keep subtracting an amount from the account public void run() { while (true) { account.withdraw((int) (Math.random() * 10) + 1); } } } // An inner class for account private static class Account { private int balance = 0; public int getBalance() { return balance; } public synchronized void withdraw(int amount) { try { while (balance < amount) { System.out.println("\t\t\tWait for a deposit"); this.wait(); } balance -= amount; System.out.println("\t\t\tWithdraw " + amount + "\t\t" + getBalance()); } catch (InterruptedException ex) { ex.printStackTrace(); } } public synchronized void deposit(int amount) { balance += amount; System.out.println("Deposit " + amount + "\t\t\t\t\t" + getBalance()); notifyAll(); } } }
No comments:
Post a Comment