java多线程实现取款小程序

 更新时间:2022年05月19日 16:40:41   作者:徐徐大嫂  
这篇文章主要为大家详细介绍了java多线程实现取款小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近java学到了多线程编程中的线程同步问题,教材中的取款小程序对于理解线程和线程同步很有帮助,在此将其补充完善.

1、建立java类

这里建立了三个java类,第一个Account类,用于封装账户中的各种信息;第三个DrawThread类用于实现线程体;第二个类主要封装了主函数

2、Account类

public class Account {
    //封装账户编号,账户余额和两个成员变量
    private String accountNo;
    private double balance;

    public Account(){};
    public Account(String accountNo,double balance){
        this.accountNo=accountNo;
        this.balance=balance;
    }

    public void setAccountNo(String accountNo)
    {
        this.accountNo=accountNo;
    }
    public void setBalance(double balance){
        this.balance=balance;
    }

    public String getAccountNo(){
        return accountNo;
    }
    public double getBalance(){
        return balance;
    }

    public int hashCode(){
        return accountNo.hashCode();
    }

    public boolean equals(Object obj){
        if(this==obj){
            return true;
        }
        if (obj!=null&&obj.getClass()==Account.class){
            Account target=(Account)obj;
            return target.getAccountNo().equals(accountNo);
        }
        return false;
    }

}

3、DrawThread类

public class DrawThread extends Thread {
    //模拟用户账户
    private Account account;
    //当前取钱线程所希望的取钱数
    private double drawAmount;

    public DrawThread(String name, Account account, double drawAmount) {
        super(name);
        this.account = account;
        this.drawAmount = drawAmount;
    }

    //当多个线程修改同一个共享数据时,将涉及数据安全问题
    public void run() {
        //使用account作为同步监视器,任何线程进入下面同步代码块之前
        //必须先获得对account账户的锁定——其他线程无法获得锁,也就无法修改它
        synchronized (account) {
            if (account.getBalance() >= drawAmount) {
                //吐出钞票
                System.out.println(getName() + "取钱成功!吐出钞票:" + drawAmount);
        /*
        try {
           Thread.sleep(1);
           }catch (InterruptedException ex)
        {
            ex.printStackTrace();
        }
        */
                //修改余额
                account.setBalance(account.getBalance() - drawAmount);
                System.out.println("\t余额为:" + account.getBalance());
            } else {
                System.out.println(getName() + "取钱失败!余额不足!");
            }
        }
    }
}

4、DrawTest类

public class DrawTest {
    public static void main(String[] args){
        //创建一个账户
        Account acct=new Account("1234567",1000);
        //模拟两个线程对同一个账户取钱
        new DrawThread("jack",acct,800).start();
        new DrawThread("rose",acct,800).start();
    }
}

运行结果:

以上程序有一点需要注意,就是用到了同步代码块。它可以解决run()方法不具备同步安全性(即当两个线程同时发送请求时即会造成异常)

同步代码块:

synchronized (obj){
//需要执行的代码
}

如果我们去掉run()方法中的同步代码块,继续运行

Account acct=new Account("1234567",1000);
new DrawThread("jack",acct,800).start();
new DrawThread("rose",acct,800).start();

(银行账户一共1000元,Jack和rose分别对同一账户取钱)

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java文件操作类 File实现代码

    Java文件操作类 File实现代码

    这篇文章主要介绍了Java文件操作类 File实现代码,需要的朋友可以参考下
    2017-08-08
  • ZooKeeper集群操作及集群Master选举搭建启动

    ZooKeeper集群操作及集群Master选举搭建启动

    这篇文章主要为大家介绍了ZooKeeper集群操作及集群Master选举搭的建启动详解,<BR>有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 利用Thumbnailator轻松实现图片缩放、旋转与加水印

    利用Thumbnailator轻松实现图片缩放、旋转与加水印

    java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,这篇文章主要介绍了利用Thumbnailator如何轻松的实现图片缩放、旋转与加水印,需要的朋友可以参考下
    2017-01-01
  • Java数组的初始化方法详解

    Java数组的初始化方法详解

    在Java程序开发中,数组是一个非常常用的数据类型,数组的初始化是使用数组来存储和处理数据的关键步骤之一,但是,关于Java数组的初始化,经常会让人感到迷惑,本文将详细介绍Java数组的初始化方法,帮助读者从此告别关于Java数组初始化的困惑
    2023-11-11
  • Java面试题冲刺第二十九天--JVM3

    Java面试题冲刺第二十九天--JVM3

    这篇文章主要为大家分享了最有价值的三道关于JVM的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java基础之堆内存溢出的解决

    Java基础之堆内存溢出的解决

    这篇文章主要介绍了Java基础之堆内存溢出的解决,文中有非常详细的图文示例及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Springboot几种任务的整合方法

    Springboot几种任务的整合方法

    这篇文章主要介绍了Springboot几种任务的整合方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java实战房屋租赁网的实现流程

    Java实战房屋租赁网的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个房屋租赁网站,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • springmvc处理响应数据的解析

    springmvc处理响应数据的解析

    今天小编就为大家分享一篇关于springmvc处理响应数据的解析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • SpringBoot中@ComponentScan注解过滤排除不加载某个类的3种方法

    SpringBoot中@ComponentScan注解过滤排除不加载某个类的3种方法

    这篇文章主要给大家介绍了关于SpringBoot中@ComponentScan注解过滤排除不加载某个类的3种方法,文中通过实例代码介绍的非常详细,对大家学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友可以参考下
    2023-07-07

最新评论