ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程同步练习:两个人同时访问一个账户,一个存款,另一个取款

2021-06-08 23:29:36  阅读:155  来源: 互联网

标签:userName Account return 一个 线程 balance public 取款


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

    }
}

标签:userName,Account,return,一个,线程,balance,public,取款
来源: https://blog.csdn.net/qq_43788197/article/details/117718378

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有