錢數要設置成靜態的變量,兩種取錢方式操作的是同一個銀行賬戶!
廢話不多說,直接上代碼。注釋寫的都很詳細!!!
package com.thread.multi2; public class Bank { // 假設一個賬戶有1000塊錢 static int money = 1000; // 櫃台取錢的方法 public synchronized void getCounter(int money1) { Bank.money -= money1;// 取錢后總數減少 System.out.println("A取走了" + money1 + "還剩下" + Bank.money); } // ATM取錢的方法 public synchronized void getATM(int money2) {// 參數是每次取走的錢 Bank.money -= money2;// 取錢后總數減少 System.out.println("B取走了" + money2 + "還剩下" + Bank.money); } }
package com.thread.multi2; public class PersonA extends Thread { // 創建銀行對象 Bank bank; // 通過構造器傳入銀行對象,確保兩個人進入的是一個銀行 public PersonA(Bank bank) { this.bank = bank; } // 重寫run方法,在里面使用櫃台取錢 @Override public void run() { while (Bank.money >= 100) { bank.getCounter(100);// 每次取走100塊 try { sleep(100);// 取完休息0.1秒 } catch (InterruptedException e) { e.printStackTrace(); } } } }
package com.thread.multi2; public class PersonB extends Thread { // 創建銀行對象 Bank bank; // 通過構造器傳入銀行對象,確保兩個人進入的是一個銀行 public PersonB(Bank bank) { this.bank = bank; } // 重寫run方法,在里面使用使用ATM取錢 @Override public void run() { while (Bank.money >= 200) { bank.getATM(200);// 每次取錢200塊 try { sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package com.thread.multi2; public class MainClass { public static void main(String[] args) { Bank bank = new Bank(); PersonA pA = new PersonA(bank); PersonB pB = new PersonB(bank); // 兩個人開始取錢 pA.start(); pB.start(); } }