千家信息网

java多线程怎么实现取款小程序

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,今天小编给大家分享一下java多线程怎么实现取款小程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一
千家信息网最后更新 2025年01月16日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多线程怎么实现取款小程序"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

0