1、建立java类

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

运行结果:

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

以上程序有一点需要注意,就是用到了同步代码块。它可以解决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多线程怎么实现取款小程序


本文参考链接:https://www.yisu.com/zixun/696778.html
评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java如何实现鲜花商城系统