用Java语言设计一个模拟用户从银行取款的应用程序。设某银行帐户存款额的初值是2000元,用线程模拟两个用户从银行取款的情况。
时间: 2024-10-21 17:16:04 浏览: 27
在Java中,我们可以创建一个BankAccount类来模拟银行账户,并使用Thread类或Runnable接口来模拟两个用户并发地进行取款操作。下面是一个简单的示例:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
class BankAccount {
private int balance = 2000; // 初始余额
private final ReentrantLock lock = new ReentrantLock();
private final Condition notEmpty = lock.newCondition();
public void withdraw(int amount) throws InterruptedException {
lock.lock();
try {
if (amount > balance) {
throw new IllegalArgumentException("Insufficient balance");
}
balance -= amount;
System.out.printf("User withdrew %d, new balance: %.2f%n", amount, balance);
if (balance == 0) {
notEmpty.signalAll(); // 如果余额为0,唤醒所有等待的线程
}
} finally {
lock.unlock();
}
}
public void startWithdrawal() {
while (true) { // 模拟无限循环,直到银行关闭
lock.lock();
try {
if (balance > 0) {
Thread.sleep(1000); // 等待随机时间模拟用户操作
lock.unlock();
// 创建并启动另一个线程取款
new Thread(() -> withdraw(Math.random.nextInt(500))).start();
} else {
notEmpty.await(); // 当余额为0时,等待其他用户取完再继续
}
} catch (InterruptedException e) {
break;
} finally {
lock.unlock();
}
}
System.out.println("Bank is closing.");
}
}
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount();
account.startWithdrawal();
}
}
```
在这个例子中,我们创建了一个BankAccount类,它有一个ReentrantLock用于同步对余额的操作,以及一个ConditionnotEmpty来帮助唤醒等待的线程。`withdraw`方法会尝试取款,如果余额不足则抛出异常,取款成功后会检查余额是否为零,如果是则唤醒所有等待的线程。
`startWithdrawal`方法会模拟用户不断取款的行为,每次取款之前都会先睡眠一段时间模拟用户的操作延迟,然后检查余额。当余额为0时,它会选择等待,直到有其他用户取款结束。
运行这个应用,你会看到两个用户交替进行取款操作,直到银行账户余额为0,显示"Bank is closing."。
阅读全文