Loading src/main/java/ch15/RyanAndMonicaSynchronizedTest.java 0 → 100644 +51 −0 Changes for src/main/java/ch15/RyanAndMonicaSynchronizedTest.java: 51 added lines, 0 removed lines. Original line number Diff line number Diff line package ch15; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class RyanAndMonicaSynchronizedTest { public static void main(String[] args) { BankAccount account = new BankAccount(); RyanAndMonicaSynchronizedJob ryan = new RyanAndMonicaSynchronizedJob("Ryan", account); RyanAndMonicaSynchronizedJob monica = new RyanAndMonicaSynchronizedJob("Monica", account); ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(ryan); executor.execute(monica); executor.shutdown(); } } class RyanAndMonicaSynchronizedJob implements Runnable { private final String name; private final BankAccount account; RyanAndMonicaSynchronizedJob(String name, BankAccount account) { this.name = name; this.account = account; } public void run() { for (int i = 0; i < 10; i++) { makeWithdrawal(10); if (account.getBalance() < 0) { System.out.println("Overdrawn!"); } } } private synchronized void makeWithdrawal(int amount) { if (account.getBalance() >= amount) { System.out.println(name + " is about to withdraw"); try { System.out.println(name + " is going to sleep"); Thread.sleep(500); } catch (InterruptedException ex) {ex.printStackTrace();} System.out.println(name + " woke up."); account.withdraw(amount); System.out.println(name + " completes the withdrawal"); } else { System.out.println("Sorry, not enough for " + name); } } } Loading
src/main/java/ch15/RyanAndMonicaSynchronizedTest.java 0 → 100644 +51 −0 Changes for src/main/java/ch15/RyanAndMonicaSynchronizedTest.java: 51 added lines, 0 removed lines. Original line number Diff line number Diff line package ch15; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class RyanAndMonicaSynchronizedTest { public static void main(String[] args) { BankAccount account = new BankAccount(); RyanAndMonicaSynchronizedJob ryan = new RyanAndMonicaSynchronizedJob("Ryan", account); RyanAndMonicaSynchronizedJob monica = new RyanAndMonicaSynchronizedJob("Monica", account); ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(ryan); executor.execute(monica); executor.shutdown(); } } class RyanAndMonicaSynchronizedJob implements Runnable { private final String name; private final BankAccount account; RyanAndMonicaSynchronizedJob(String name, BankAccount account) { this.name = name; this.account = account; } public void run() { for (int i = 0; i < 10; i++) { makeWithdrawal(10); if (account.getBalance() < 0) { System.out.println("Overdrawn!"); } } } private synchronized void makeWithdrawal(int amount) { if (account.getBalance() >= amount) { System.out.println(name + " is about to withdraw"); try { System.out.println(name + " is going to sleep"); Thread.sleep(500); } catch (InterruptedException ex) {ex.printStackTrace();} System.out.println(name + " woke up."); account.withdraw(amount); System.out.println(name + " completes the withdrawal"); } else { System.out.println("Sorry, not enough for " + name); } } }