当前位置:首页 > 开发教程 > java教程 >

java多线程实现取款小程序

时间:2022-05-20 09:30 来源:未知 作者:伴你99不会走 收藏

这篇文章主要为大家详细介绍了java多线程实现取款小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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多线程实现取款小程序

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


下一篇:没有了

java教程阅读排行

最新文章