用多线程设计模拟银行的工作情形。银行有多个窗口和取款机,用多个线程去操作一个账户存款或取款,要求取款时不能透支,如果要取的金额大于账户余额提示取款失败。每次存、取款需要打印交易时间、交易类型、窗口名以及账户目前余额。要求有简单的界面设计,常见异常情况需要提示(如余额不足等)
这种操作性问题,要写代码实现。核心就是一个账户金额的并发操作,可以加锁解决
import java.time.LocalDateTime;
import java.util.Random;
import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Account {
private double _balance = 0.0;
private Lock _mutex = new ReentrantLock(true);
public Account(double balance) {
_balance = balance;
}
public double getBalance() {
return _balance;
}
public void withdraw(double amount) throws Exception {
if (_balance < amount)
throw new Exception("insufficient funds");
_mutex.lock();
_balance -= amount;
_mutex.unlock();
}
public void deposit(double amount) {
_mutex.lock();
_balance += amount;
_mutex.unlock();
}
}
class Counter extends Thread {
private String _name;
private Account _account;
public Counter(String name, Account account) {
_name = name;
_account = account;
}
public void withdraw(double amount) {
try {
_account.withdraw(amount);
System.out.println(
LocalDateTime.now() + ", withdraw " + amount + ", " + _name + ", balance = "
+ _account.getBalance());
} catch (Exception e) {
System.out.println("failed to withdraw due to " + e.getMessage());
}
}
public void deposit(double amount) {
_account.deposit(amount);
System.out.println(
LocalDateTime.now() + ", deposit " + amount + ", " + _name + ", balance = " + _account.getBalance());
}
public void run() {
try {
Random rand = new Random();
while (true) {
int type = rand.nextInt(2);
int amount = rand.nextInt(100);
if (type == 0)
withdraw(amount);
else
deposit(amount);
sleep(1000 + rand.nextInt(2000));
}
} catch (Exception e) {
System.out.println(e);
}
}
}
class Bank {
public static void main(String[] args) {
Account account = new Account(1000.0);
ArrayList<Counter> counters = new ArrayList<Counter>();
for (int i = 0; i < 5; i++)
counters.add(new Counter("C" + i, account));
for (int i = 0; i < 5; i++)
counters.get(i).start();
}
}
最简单的就是数据库条件修改余额变更,例如:update account set balance = balance - amount where balance - amount >= 0;
https://blog.csdn.net/weixin_66813230/article/details/123657726
兄弟,你这是毕设或者是实验周吧。。