package day08;
import java.util.Objects;
/*
编程:假设一个银行的 ATM 机,它允许用户存款也可以取款。
现在一个账户(Account)上存款为 200 元,
用户 A 和用户 B 都拥有这个账户存款和取款的权利。
用户 A 存入 100 元,而用户 B 将取出 50 元,
则最终账户的存款应为 250 元。
为了模拟以上过程,描述如下:
(1)定义一个 Account 类,属性为账户名(userName)和余额(balance),类进行封装
(2)线程 ThreadA 负责存钱操作;线程 ThreadB 负责取钱操作;
(3)main 函数中负责开启两个线程,并将存取操作结束之后的账户余额进行打印输出
*/
//创建ATM类
class Account{
private String userName;
private Double balance;
@Override
public String toString() {
return "Account{" +
"userName='" + userName + '\'' +
", balance=" + balance +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Account account = (Account) o;
return Objects.equals(userName, account.userName) && Objects.equals(balance, account.balance);
}
@Override
public int hashCode() {
return Objects.hash(userName, balance);
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public Account(String userName, Double balance) {
this.userName = userName;
this.balance = balance;
}
public Account() {
}
}
//创建线程类ThreadA,继承Thread类,实现run方法
class ThreadA extends Thread{
//创建任务对象
private Account a;
//构造方法
public ThreadA(){}
public ThreadA(Account a){
this.a=a;
}
//实现run方法:存100块
public void run(){
//线程同步
synchronized (a){
//存钱100元
System.out.println("余额为:" + a.getBalance());
System.out.println("存钱金额:100");
//调用对象a方法存款
a.setBalance(a.getBalance()+100);
//输出结果
System.out.println("当前余额:" + a.getBalance());
}
}
}
class ThreadB extends Thread{
//创建任务对象,封装
private Account a;
//构造方法
public ThreadB(){}
public ThreadB(Account a){
this.a=a;
}
//实现run方法 取款
public void run(){
synchronized (a){
System.out.println("余额为:"+a.getBalance());
System.out.println("取款50元");
//调用取款方法
a.setBalance(a.getBalance()-50);
//输出结果
System.out.println("当前余额:" + a.getBalance());
}
}
}
public class Test19 {
public static void main(String[] args) {
//创建任务对象
Account a = new Account("Mario的账户",200D);
//用任务对象为参数,创建线程对象存款t1
Thread t1 = new ThreadA(a);
//用任务对象为参数,创建线程对象取款t2
Thread t2 = new ThreadB(a);
//启动线程
t2.start();
t1.start();
}
}