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