钱数要设置成静态的变量,两种取钱方式操作的是同一个银行账户!
废话不多说,直接上代码。注释写的都很详细!!!
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();
}
}