键盘输入取钱金额假设张三的微信绑定他的一张银行卡,他老婆的支付宝也绑定同一张银行卡,银行卡当前的余额是 1000 元,当天他多次使用微信支付取款,他老婆则多次使用支付宝取款。用 Java 代码的多线程模拟。
时间: 2023-08-31 12:20:40 浏览: 47
### 回答1:
以下是使用 Java 多线程模拟张三和他老婆同时取款的示例代码:
```java
class BankAccount {
private int balance;
public BankAccount(int initialBalance) {
balance = initialBalance;
}
public int getBalance() {
return balance;
}
public void withdraw(int amount) {
balance -= amount;
}
}
class Withdrawal implements Runnable {
private BankAccount account;
private String accountHolder;
private int amount;
public Withdrawal(BankAccount account, String accountHolder, int amount) {
this.account = account;
this.accountHolder = accountHolder;
this.amount = amount;
}
public void run() {
System.out.println(accountHolder + " is withdrawing " + amount + " yuan.");
synchronized (account) {
if (account.getBalance() >= amount) {
account.withdraw(amount);
System.out.println(accountHolder + " has withdrawn " + amount + " yuan. Remaining balance: " + account.getBalance() + " yuan.");
} else {
System.out.println(accountHolder + " does not have enough money.");
}
}
}
}
public class BankDemo {
public static void main(String[] args) {
BankAccount account = new BankAccount(1000);
Thread t1 = new Thread(new Withdrawal(account, "Zhang San (WeChat)", 500));
Thread t2 = new Thread(new Withdrawal(account, "Zhang San's wife (Alipay)", 800));
Thread t3 = new Thread(new Withdrawal(account, "Zhang San (WeChat)", 200));
Thread t4 = new Thread(new Withdrawal(account, "Zhang San's wife (Alipay)", 300));
t1.start();
t2.start();
t3.start();
t4.start();
}
}
```
在这个示例中,我们定义了一个 `BankAccount` 类来模拟银行账户,其中有 `getBalance` 和 `withdraw` 方法来获取余额和取款操作。然后,我们定义了一个 `Withdrawal` 类作为线程的执行体,它接受一个 `BankAccount` 对象、取款人名称和取款金额作为参数,在运行时,它会检查账户余额是否足够进行取款操作,如果足够,则执行取款操作并打印剩余余额,否则打印无法取款的信息。最后,我们在 `main` 方法中定义四个线程分别模拟张三和他老婆使用微信支付和支付宝取款的场景,并启动它们。
需要注意的是,在 `Withdrawal` 类的 `run` 方法中,我们使用了 `synchronized` 关键字来保证多个线程对同一个账户进行取款操作时不会出现竞态条件。这是因为在多线程环境下,如果不加锁,多个线程可能同时检查到账户余额充足而执行取款操作,导致余额出现错误。加锁可以保证只有一个线程可以进入临界区执行操作,避免竞态条件的发生。
### 回答2:
下面是一个使用Java多线程模拟上述场景的示例代码:
```java
class Bank {
private int balance = 1000;
public synchronized void withdraw(int amount) {
if (balance >= amount) {
balance -= amount;
System.out.println(Thread.currentThread().getName() + "使用微信支付取款:" + amount + "元,余额:" + balance + "元");
} else {
System.out.println(Thread.currentThread().getName() + "使用微信支付取款失败,余额不足:" + balance + "元");
}
}
}
class WechatWithdrawThread extends Thread {
private Bank bank;
private int amount;
public WechatWithdrawThread(Bank bank, int amount) {
this.bank = bank;
this.amount = amount;
}
public void run() {
bank.withdraw(amount);
}
}
class AlipayWithdrawThread extends Thread {
private Bank bank;
private int amount;
public AlipayWithdrawThread(Bank bank, int amount) {
this.bank = bank;
this.amount = amount;
}
public void run() {
bank.withdraw(amount);
}
}
public class Main {
public static void main(String[] args) {
Bank bank = new Bank();
WechatWithdrawThread zhangSanWithdrawThread = new WechatWithdrawThread(bank, 500);
AlipayWithdrawThread wifeWithdrawThread = new AlipayWithdrawThread(bank, 300);
zhangSanWithdrawThread.start();
wifeWithdrawThread.start();
}
}
```
上述代码中,银行类`Bank`维护了当前的余额,并提供了`synchronized`修饰的`withdraw`方法来处理取款操作。当余额足够时,就进行取款并输出相关信息;当余额不足时,输出取款失败信息。
`WechatWithdrawThread`和`AlipayWithdrawThread`分别代表张三和他老婆使用微信支付和支付宝取款的线程。在`run`方法中调用银行的`withdraw`方法进行取款操作。
在`Main`类中,创建一个`Bank`实例和两个取款线程`WechatWithdrawThread`和`AlipayWithdrawThread`,分别代表张三和他老婆。然后调用`start`方法启动线程。根据代码,张三使用微信支付取款500元,他的老婆使用支付宝取款300元。
最终的输出结果可能如下:
```
Thread-0使用微信支付取款:500元,余额:500元
Thread-1使用支付宝取款:300元,余额:200元
```
### 回答3:
以下是使用Java代码多线程模拟键盘输入取钱金额的情况:
```java
public class WithdrawalSimulation {
private static int balance = 1000;
public static void main(String[] args) {
Thread zhangSanThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
int withdrawAmount = KeyboardInput.getInput();
synchronized (WithdrawalSimulation.class) {
if (withdrawAmount <= balance) {
System.out.println("张三成功从微信支付取款:" + withdrawAmount + "元");
balance -= withdrawAmount;
} else {
System.out.println("张三微信支付取款失败,余额不足!");
}
}
}
}
});
Thread wifeThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
int withdrawAmount = KeyboardInput.getInput();
synchronized (WithdrawalSimulation.class) {
if (withdrawAmount <= balance) {
System.out.println("张三的妻子成功从支付宝取款:" + withdrawAmount + "元");
balance -= withdrawAmount;
} else {
System.out.println("张三的妻子支付宝取款失败,余额不足!");
}
}
}
}
});
zhangSanThread.start();
wifeThread.start();
}
}
class KeyboardInput {
public static int getInput() {
// 从键盘输入获取取款金额
Scanner scanner = new Scanner(System.in);
System.out.println("请输入取款金额:");
int withdrawAmount = scanner.nextInt();
return withdrawAmount;
}
}
```
说明:
1. 在`WithdrawalSimulation`类中,`balance`表示银行卡的当前余额。为了保证线程安全,使用`synchronized`关键字对共享资源进行加锁。
2. `zhangSanThread`表示张三使用微信支付取款的线程。线程内使用循环进行多次取款操作,并调用`KeyboardInput.getInput()`方法从键盘输入获取取款金额。如果余额足够,则成功取款,否则取款失败。
3. `wifeThread`表示张三的妻子使用支付宝取款的线程。线程内使用循环进行多次取款操作,并调用`KeyboardInput.getInput()`方法从键盘输入获取取款金额。如果余额足够,则成功取款,否则取款失败。
4. `KeyboardInput`类中的`getInput()`方法用于从键盘输入获取取款金额。
在运行程序时,每次将从键盘输入的金额作为取款金额,然后张三和他的妻子轮流使用微信支付和支付宝取款。当余额不足时会有相应的提示信息输出。