java多线程怎么实现取款小程序
作者:小月亮
时间:2023-04-26
浏览:0
1、建立java类这里建立了三个java类,第一个Account类,用于封装账户中的各种信息;第三个DrawThread类用于实现线程体;第二个类主要封装了主函数2、Account类publicclassAccount{//封装账户编号,账户余额和两个成员变量privateStringaccountNo;privatedoublebalance;publicAccount(){};publicAccount(StringaccountNo,doublebalance){this.accountNo=acc
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分别对同一账户取钱)
运行结果:

作者最新文章
Para 翻译无法打开怎么办及解决方法详解
2026-10-09 15:19
photozoom pro 8是什么软件及主要功能用途介绍
2026-10-08 10:22
JMeter入门:创建HTTP请求并验证响应结果
2026-09-02 10:20
文件表格制作教程:选择Word或Excel的判断方法
2026-09-02 09:45
多个PPT怎么一次性转PDF?PPT批量转换工具有哪些?
2026-09-02 06:00
上一篇:
java MyBatis中jar如何下载
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多










































