2.1使用synchronized实现同步方法

来源:互联网 发布:python celery 教程 编辑:程序博客网 时间:2024/06/05 02:39

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.运行结果如下:
这里写图片描述
在模拟存取账户金额的同时,这边也考虑到了实际的情况:如果账户余额不够需要取出的钱的话,那么久不能取。

0 0