Java多线程之使用ATM与柜台对同一账户取钱


钱数要设置成静态的变量,两种取钱方式操作的是同一个银行账户!

废话不多说,直接上代码。注释写的都很详细!!!

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();
    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM