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多线程怎么实现取款小程序的详细内容。