模拟一个简单的银行系统,使用两个不同的线程向同一个账户存钱。 账户的初始余额是1000元,两个线程每次存储100元,分别各存储1000元,不允许出现错误数据,要求轮流存钱、要求使用wait和notify方法实现。 程序运行结果如下图所示(请将其中一个账号名改为自己的名字):
时间: 2024-12-29 20:34:08 浏览: 9
在一个简单的银行系统中,我们可以使用Java的并发库来模拟这个场景。这里会创建一个Account类作为共享资源,同时有两个BankThread类作为线程来代表两个用户存款。我们将使用`synchronized`, `wait()`, 和 `notify()` 方法来实现线程之间的协作,确保存款顺序以及防止数据竞争。
首先,定义Account类:
```java
public class Account {
private int balance = 1000;
private String owner;
public Account(String owner) {
this.owner = owner;
}
public synchronized void deposit(int amount) throws InterruptedException {
while (balance + amount > 2000) { // 防止超过最大值
System.out.println(owner + "等待存款...");
wait();
}
balance += amount;
System.out.println(owner + "已存款 " + amount);
notifyAll(); // 唤醒其他等待的线程
}
public synchronized int getBalance() {
return balance;
}
@Override
public String toString() {
return "Account{" +
"balance=" + balance +
", owner='" + owner + '\'' +
'}';
}
}
```
然后,创建BankThread类来表示用户存款操作:
```java
public class BankThread extends Thread {
private Account account;
public BankThread(Account account, String name) {
super(name);
this.account = account;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
try {
account.deposit(100); // 每次存款100元
Thread.sleep(50); // 引入延迟以模拟真实情况
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(account + "存款完成");
}
}
```
最后,主函数启动两个线程:
```java
public static void main(String[] args) throws InterruptedException {
Account account = new Account("Alice"); // 更改为你想要的名字
BankThread thread1 = new BankThread(account, "User1");
BankThread thread2 = new BankThread(account, "User2");
thread1.start();
thread2.start();
// 等待所有线程结束
thread1.join();
thread2.join();
System.out.println(account);
// 输出最终账户余额
}
```
当运行此程序时,你会看到"User1", "User2"交替存款,并保证了账户余额始终不超过2000元。每个用户的存款都是1000次,每次100元。如果需要,可以修改主线程的部分,调整线程睡眠时间,以便观察线程间的交互更明显。
阅读全文