Thread 執行緒之 銀行賬戶多視窗存取款實現
阿新 • • 發佈:2019-02-11
Thread之 模擬多銀行多視窗多使用者存取錢
- 實現多視窗取錢操作
- 實現多視窗存取操作
- 實現存取的同步
- 當賬號餘額到一定額度限制存取操作的暫停和繼續
方法摘要
- start()執行緒就緒
- synchronized()執行緒執行同步程式碼塊
- wait() 執行緒等待
- notifyAll() 喚醒 所有此物件監視器上的等待執行緒
程式碼實現如下
此模組實現 主執行緒建立三個取錢 兩個存錢執行緒物件
public static void main(String[] args) { // 建立一個銀行賬戶並用構造初始化賦值 賬號 餘額 Account account = new Account("95599 001", 5000); //建立三個取錢的執行緒物件傳入引數 取錢使用者名稱 賬戶物件 取錢額 Withdraw w1 = new Withdraw("張三", account, 1000); Withdraw w2 = new Withdraw("李四", account, 3000); Withdraw w3 = new Withdraw("王五", account, 4000); //建立兩個存錢的執行緒物件傳入引數 存錢使用者名稱 賬戶物件 存錢額 SaveMoney s1 = new SaveMoney("圓圓", account, 5000); SaveMoney s2 = new SaveMoney("方方", account, 1000); //就緒三個取錢執行緒和兩個存錢執行緒 w1.start(); w2.start(); w3.start(); s1.start(); s2.start(); }
此模組實現 存錢執行緒的建立
class SaveMoney extends Thread { private double money; private Account account; /** * 構造 * * @param threadName * 執行緒名稱 * @param account * 操作的賬戶物件 * @param money * 要取的錢數 */ public SaveMoney(String threadName, Account account, double money) { super(threadName);// 為當前執行緒設定名稱 this.account = account; this.money = money; } @Override public void run() { while (true) { //此處實現同步程式碼塊保證執行緒操作完整執行 synchronized (account) { if (account.getBalance()>=10000) { try { account.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } account.setBalance(account.getBalance() + money);// 存錢成功 System.out.println(Thread.currentThread().getName() + ",存了一筆大錢-" + money + ",,目前賬戶餘額是:" + account.getBalance()); account.notifyAll(); } } } } }
此模組實現 取錢執行緒的建立
class Withdraw extends Thread { private double money; private Account account; /** * 構造 * * @param threadName * 執行緒名稱 * @param account * 操作的賬戶物件 * @param money * 要取的錢數 */ public Withdraw(String threadName, Account account, double money) { super(threadName);// 為當前執行緒設定名稱 this.account = account; this.money = money; } @Override public void run() { while (true) { //此處實現同步程式碼塊保證執行緒操作完整執行 synchronized (account) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } if (account.getBalance() < money) {// 餘額不足 System.out.println(Thread.currentThread().getName() + " 取錢中,打算取" + money + "結果:餘額不足"); try { account.wait();//餘額不足,需要等待 } catch (InterruptedException e) { e.printStackTrace(); } } else { account.setBalance(account.getBalance() - money);// 更改餘額 System.out.println(Thread.currentThread().getName() + " 取錢中,取了" + money + ",餘額:" + account.getBalance()); //喚醒 所有此物件監視器上的等待執行緒 account.notifyAll(); } } } } }
此模組實現 銀行賬戶實體類的封裝
重寫equals() 和 hashCode()方法
class Account {
private String id;
private double balance;
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Account)) {
return false;
}
Account acc = (Account) obj;
return acc.id.equals(this.id);
}
@Override
public int hashCode() {
return id.hashCode();
}
public Account() {
}
public Account(String id, double balance) {
super();
this.id = id;
this.balance = balance;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}