2.1使用synchronized实现同步方法

    xiaoxiao2023-03-24  5

    1.创建Account类,该类用于模拟银行账户

    public class Account { //账户的余额 private double balance; //取得账户的余额 public double getBalance() { return balance; } //设置账户的余额 public void setBalance(double balance) { this.balance = balance; } //将增加的数量加入到余额中 public synchronized void addAmount(double amount) { double tmp=balance; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } tmp+=amount; balance=tmp; System.out.println("存入后,当前账户余额:"+balance); } //从余额中减去相应的数量 public synchronized void subtractAmount(double amount) { double tmp=balance; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } if(tmp>=amount) { tmp-=amount; balance=tmp; System.out.println("取出后,当前账户余额:"+balance); } } }

    2.创建实现Runnable接口的Bank类,模拟ATM机取款

    public class Bank implements Runnable{ private Account account; public Bank(Account account) { this.account=account; } @Override public void run() { //每次 从账户余额中减去1000 for (int i=0; i<10; i++){ account.subtractAmount(1000); } } }

    3.创建实现Runnable接口的Company类,用于模拟往账户中汇款

    public class Company implements Runnable{ private Account account; public Company(Account account) { this.account=account; } @Override public void run() { for (int i=0; i<10; i++){ account.addAmount(1000); } } }

    4.主类的实现

    public class Main { public static void main(String[] args) { // 创建爱你 一个新的账户 Account account=new Account(); // 设置账户的初始余额 account.setBalance(1000); // 创建一个模拟的公司实体对象,并作为线程的参数传入启动线程 Company company=new Company(account); Thread companyThread=new Thread(company); // 创建一个模拟的银行实体对象,并作为线程的参数传入启动线程 Bank bank=new Bank(account); Thread bankThread=new Thread(bank); // 打印账户的余额 System.out.printf("Account : Initial Balance: %f\n",account.getBalance()); // 启动线程 companyThread.start(); bankThread.start(); try { // 等待线程运行完毕 companyThread.join(); bankThread.join(); // 打印最终的余额 System.out.printf("Account : Final Balance: %f\n",account.getBalance()); } catch (InterruptedException e) { e.printStackTrace(); } } }

    4.运行结果如下: 在模拟存取账户金额的同时,这边也考虑到了实际的情况:如果账户余额不够需要取出的钱的话,那么久不能取。

    转载请注明原文地址: https://ju.6miu.com/read-1201372.html
    最新回复(0)