1. 程式人生 > >Thread 執行緒之 銀行賬戶多視窗存取款實現

Thread 執行緒之 銀行賬戶多視窗存取款實現

Thread之 模擬多銀行多視窗多使用者存取錢

  1. 實現多視窗取錢操作
  2. 實現多視窗存取操作
  3. 實現存取的同步
  4. 當賬號餘額到一定額度限制存取操作的暫停和繼續

方法摘要

  • 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;
}
}