小明、小美、小娟共用一张银行卡,其中,小明每次向银行卡里面存 [1000,2000] 块钱,
* 小美、小娟每次从银行卡里面取 [300, 600] 块钱。当卡里没钱的时候,会通知小明存钱。
* 小明存完钱之后,通知他们两个人取钱。设计程序,实现这个场景。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class test {
public static void main(String[] args) {
BankCard bankCard = new BankCard(1);
Producer xiaoming = new Producer(bankCard,"小明");
Consumer xiaomei = new Consumer(bankCard,"小美");
Consumer xiaojuan = new Consumer(bankCard,"小娟");
xiaoming.start();
xiaomei.start();
xiaojuan.start();
}
}
class Producer extends Thread{
public BankCard bankCard;
public Producer(BankCard bankCard,String name){
super(name);
this.bankCard=bankCard;
}
@Override
public void run() {
while(true){
//存钱
bankCard.saveMoney();
}
}
}
class Consumer extends Thread{
public BankCard bankCard;
public Consumer(BankCard bankCard,String name){
super(name);
this.bankCard = bankCard;
}
@Override
public void run() {
while(true){
//取钱
bankCard.withdrawMoney();
}
}
}
class BankCard{
//卡里的余额
private int money;
//标志位,标志卡里的钱能否够小美小娟取一次的
private boolean isEmpty = true;
//定义一个随机数对象
Random random = new Random();
public int getMoney() {
return money;
}
public BankCard(int money) {
this.money = money;
}
public synchronized void saveMoney() {
//循环判断卡里余额是否够小美小娟取一次的
while (!isEmpty){
try {
//如果卡里余额够的时候,就等等再存。
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//随机生成【1000,2000】的存钱金额
int saving = random.nextInt(1001)+1000;
this.money+=saving;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+""+Thread.currentThread().getName()+"存入了"+saving+"元,卡里余额"+this.money+"元,小美小娟来消费了!!!");
isEmpty = false;
//存了钱,通知小美小娟,卡里钱够了。
this.notifyAll();
}
public synchronized void withdrawMoney() {
//循环判断
while(isEmpty){
try {
//当卡里余额不够取的时候,等等再取
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int withdrawal = random.nextInt(301)+300;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//如果卡里余额不够当前取得时候,通知小明该存钱了。
if(this.money< withdrawal) {
isEmpty=true;
this.notify();
}
else{
this.money-=withdrawal;
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+""+Thread.currentThread().getName()+"取走了"+withdrawal+"元,卡里余额"+this.money+"元.");
}
}
}