package com.youkeda.test.threadpool; import java.util.Objects; public class Account { // 假设一个账户有1000块钱 private static double money = 1000; // 柜台Counter取钱的方法 private void outByWindow(double money) { Account.money -= money; System.out.println("柜台取钱" + money + "元,剩余" + Account.money + "元!"); } // ATM取钱的方法 private void outByAtm(double money) { Account.money -= money; System.out.println("ATM取钱" + money + "元,剩余" + Account.money + "元!"); } //提供一个对外取款途径,防止直接调取方法同时取款时,并发余额显示错误 public synchronized void outMoney(double money, String type) throws Exception { if (money > Account.money) { //校验余额是否充足 throw new Exception("取款" + money + "元失败,余额" + Account.money + "元!"); } if (Objects.equals(type, "ATM")) { outByAtm(money); } else { outByWindow(money); } } public static double getMoney() { return money; } } package com.youkeda.test.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Bank { private static final ExecutorService threadPool = Executors.newFixedThreadPool(10); public static void main(String[] args) { Account account = new Account(); // 实例化两个人,传入同一个银行账户的对象 Person a = new Person("路晓欧", "Window", account); Person b = new Person("姚远", "ATM", account); threadPool.execute(a); threadPool.execute(b); } } package com.youkeda.test.threadpool; import java.util.Objects; public class Person implements Runnable { private String name; private String type; private Account account; public Person(String name, String type, Account account) { this.name = name; this.type = type; this.account = account; } @Override public void run() { double dropMoney; if (Objects.equals(type, "ATM")) { dropMoney = 50; } else { dropMoney = 100; } while (Account.getMoney() >= dropMoney) { try { account.outMoney(dropMoney, type); } catch (Exception e1) { e1.printStackTrace(); } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
