【生产者消费者问题】小明小美小娟共用一张银行卡,其中,小明每次向银行卡里面存 [1000,2000] 块钱,小美、小娟每次从银行卡里面取 [300, 600] 块钱。当卡里没钱的时候,会通知小明存钱。

本文介绍了一个使用Java实现的多线程同步操作场景:小明、小美、小娟共用一张银行卡,小明负责存款,而小美和小娟负责取款。通过synchronized关键字和wait/notify机制确保线程间的正确同步。
小明、小美、小娟共用一张银行卡,其中,小明每次向银行卡里面存 [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+"元.");
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值