package thread;
public class Bank{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bank(String name) {
super();
this.name = name;
}
// 一个账户有2000块钱
static int money = 2000;
// 柜台取钱的方法
public void Counter(int money) {//每次取走的钱数
Bank.money -= money;//取钱后总额减少
}
// ATM取钱的方法
public void ATM(int money) {//每次取走的钱数
Bank.money -= money;//取钱后总额减少
}
private static String[] shareObj = {"true"}; // 创建一个静态钥匙//可以任意定义
static class PersonA extends Thread {
// 创建银行对象
Bank bank;
//通过构造器传入银行对象,确保两个人进入的是一个银行
public PersonA(Bank bank, String name) {
super(name);
this.bank = bank;
}
//重写run方法,在里面实现使用柜台取钱
@Override
public void run() {
synchronized (shareObj) {// 这个很重要属于银行的取款号码,一个人完成下一个人才能使用柜台取款
while (Bank.money >= 100) {
int money = 100;
bank.Counter(money);// 每次取100块
System.out.println(this.getName()+"在"+bank.getName()+"取走了" +money + "还剩下" +(Bank.money));
try {
shareObj.wait();//柜台工作人员暂停服务!
} catch (InterruptedException e) {
e.printStackTrace();
}
if(Bank.money==0){
System.err.println("不好意思银行暂时没有现金了!");
break;
}
try {
sleep(1000);//取完柜台工作人员休息1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class PersonB extends Thread{
// 创建银行对象
Bank bank;
// 通过构造器传入银行对象,确保两个人进入的是一个银行
public PersonB(Bank bank, String name) {
super(name);
this.bank = bank;
}
// 重写run方法,在里面实现使用柜台取钱
@Override
public void run() {
synchronized (shareObj) {
while (Bank.money >= 200) {
int money = 200;
bank.ATM(money);// 每次取200块
System.out.println(this.getName()+"在"+bank.getName()+"取走了" + money + "还剩下" +(Bank.money));
shareObj.notifyAll();
if(Bank.money==0){
System.err.println(this.getName()+"在"+bank.getName()+"把剩余的钱取完了!");
break;
}
try {
sleep(1000);// ATM反应1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
//三个人在银行取钱
public static void main(String[] args) {
//银行的柜台
Bank bank1 = new Bank("银行柜台");
//银行的取款机
Bank bank2 = new Bank("银行ATM机");
// 实例化三个人,在同一个银行取钱
PersonA pA = new PersonA(bank1,"A");
PersonA PA2 = new PersonA(bank1,"B");
PersonB pB = new PersonB(bank2,"C");
//pA和PA2在柜台排队取钱:PB在ATM机取钱
pA.start();
PA2.start();
pB.start();
}
}
}
public class Bank{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bank(String name) {
super();
this.name = name;
}
// 一个账户有2000块钱
static int money = 2000;
// 柜台取钱的方法
public void Counter(int money) {//每次取走的钱数
Bank.money -= money;//取钱后总额减少
}
// ATM取钱的方法
public void ATM(int money) {//每次取走的钱数
Bank.money -= money;//取钱后总额减少
}
private static String[] shareObj = {"true"}; // 创建一个静态钥匙//可以任意定义
static class PersonA extends Thread {
// 创建银行对象
Bank bank;
//通过构造器传入银行对象,确保两个人进入的是一个银行
public PersonA(Bank bank, String name) {
super(name);
this.bank = bank;
}
//重写run方法,在里面实现使用柜台取钱
@Override
public void run() {
synchronized (shareObj) {// 这个很重要属于银行的取款号码,一个人完成下一个人才能使用柜台取款
while (Bank.money >= 100) {
int money = 100;
bank.Counter(money);// 每次取100块
System.out.println(this.getName()+"在"+bank.getName()+"取走了" +money + "还剩下" +(Bank.money));
try {
shareObj.wait();//柜台工作人员暂停服务!
} catch (InterruptedException e) {
e.printStackTrace();
}
if(Bank.money==0){
System.err.println("不好意思银行暂时没有现金了!");
break;
}
try {
sleep(1000);//取完柜台工作人员休息1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class PersonB extends Thread{
// 创建银行对象
Bank bank;
// 通过构造器传入银行对象,确保两个人进入的是一个银行
public PersonB(Bank bank, String name) {
super(name);
this.bank = bank;
}
// 重写run方法,在里面实现使用柜台取钱
@Override
public void run() {
synchronized (shareObj) {
while (Bank.money >= 200) {
int money = 200;
bank.ATM(money);// 每次取200块
System.out.println(this.getName()+"在"+bank.getName()+"取走了" + money + "还剩下" +(Bank.money));
shareObj.notifyAll();
if(Bank.money==0){
System.err.println(this.getName()+"在"+bank.getName()+"把剩余的钱取完了!");
break;
}
try {
sleep(1000);// ATM反应1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
//三个人在银行取钱
public static void main(String[] args) {
//银行的柜台
Bank bank1 = new Bank("银行柜台");
//银行的取款机
Bank bank2 = new Bank("银行ATM机");
// 实例化三个人,在同一个银行取钱
PersonA pA = new PersonA(bank1,"A");
PersonA PA2 = new PersonA(bank1,"B");
PersonB pB = new PersonB(bank2,"C");
//pA和PA2在柜台排队取钱:PB在ATM机取钱
pA.start();
PA2.start();
pB.start();
}
}
}