steve_h 2017-03-05 04:03 采纳率: 40%
浏览 1474
已结题

Java多线程模拟储蓄卡账户流水

模拟一个储蓄卡账户,起初额度是100元,模拟取现、存款等多次操作。 1.可以先取出1元,再存入1元,有1000次以上的流水即可。 2.输出结果可为示例:”向账户取了1元,账户还有X元“,或者”向账户存了1元,账户还有X元“。其中X为当前储蓄卡内的余额。 3.为了方便查看结果,流水次数最好以10的倍数。

  • 写回答

3条回答 默认 最新

  • wild84 2017-03-05 04:54
    关注

    我刚好写了一个,看看是不是你要的

     public class AccountTest {
        public static void main(String[] args) {
            Account account=new Account();
            Bank bank=new Bank();
            bank.setAccount(account);
            Thread t1=new Thread(new PeopleIn(bank));
            Thread t2=new Thread(new PeopleOut(bank));
            t1.setName("张三");
            t2.setName("张三的老婆");
            t1.start();
            t2.start();
        }
    }
    class Account{
        private int balance=100;
        public int getBalance(){
            return this.balance;
        }
        public void amountOut(int amt){
            balance=balance-amt;
            System.out.println(Thread.currentThread().getName()+"取款"+amt);
        }
        public void amountIn(int amt){
            balance=balance+amt;
            System.out.println(Thread.currentThread().getName()+"存款"+amt);
        }
    }
    class Bank{
        private Account account;
        private boolean flag=false;
        public void setAccount(Account account){
            this.account=account;
        }
        public Account getAccount(){
            return account;
        }
        public synchronized void moneyOut(int amt) {
                if(flag==false){
                    try {
                        //System.out.println("老公还未存钱,余额不足。");
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(this.account.getBalance()>0){
                    account.amountOut(amt);
                    System.out.println("账户余额"+this.account.getBalance());
                }else {
                    System.out.println("余额不足,无法完成取款。");
                }
                this.flag=false;
                this.notify();
            }
    
        public synchronized void moneyIn(int amt) {
                if(flag){
                    try {
                        //System.out.println("老婆还未取钱,无法存钱。");
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(this.account.getBalance()<100){
                    account.amountIn(amt);
                    System.out.println("账户余额"+this.account.getBalance());
                }else {
                    System.out.println("账户金额已满,无法完成存款。");
                }
                this.flag=true;
                this.notify();
            }
        }
    
    class PeopleIn implements Runnable{
        private  Bank bank;
        public PeopleIn(Bank bank){
            this.bank=bank;
        }
        @Override
        public void run() {
            for(int i=0;i<20;i++){
            bank.moneyIn(100);
            }
        }
    }
    class PeopleOut implements Runnable{
        private  Bank bank;
        public PeopleOut(Bank bank){
            this.bank=bank;
        }
        @Override
        public void run() {
            for(int i=0;i<20;i++){
            bank.moneyOut(100);
            }
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 链接问题 C++LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接