Java多线程课后题,张三和他妻子各拥有一张银行卡和存折,可以对同一个银行账户进行存取款的操作,现在余款为500,每人各取5次,每次为100元。在取款空模拟网络延迟。

public class Car implements Runnable {
    private int money=500;//余款
    @Override
    public void run() {
    for (int i = 0; i < 5; i++) {
    synchronized (this) {
    money = money - 100;
    if (money >= 0) {
        System.out.println(Thread.currentThread().getName() + "准备取款");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "完成取款");
    } else {
        System.out.println("余额不足以支付" + Thread.currentThread().getName() + "的取款,余额为0");
    }
}
        }
    }
    public static void main(String[] args) {
        Car car=new Car();
        new Thread(car,"张三").start();
        new Thread(car,"张三的妻子").start();
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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()`方法用于从键盘输入获取取款金额。 在运行程序时,每次将从键盘输入的金额作为取款金额,然后张三和他的妻子轮流使用微信支付和支付宝取款。当余额不足时会有相应的提示信息输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值