qq_43461674 2021-09-30 17:17 采纳率: 100%
浏览 58
已结题

thread.start()方法的疑问

这是一个双线程的银行取款问题
public class Account
/*
银行类
*/
{

private int balance = 600;//余额

public void withBalance(int money)  //取款方法
{
    this.balance = this.balance - money;
}

public int getBalance()//返回余额
{
    return balance;
}

}

public class AccountRunnable implements Runnable { /*
取款线程
*/

private Account account = new Account();//创建一个银行类的对象

@Override
public void run()
{

    if (account.getBalance() > 400)
    {
        account.withBalance(400);//取款400
        System.out.println(Thread.currentThread().getName()+"取款成功"+"当前余额为"+account.getBalance());
        // 输出当前线程的名字 和 钱款剩余

    }
    else
        {
        System.out.println(Thread.currentThread().getName()+"余额不足"+"当前余额为"+account.getBalance());
            // 输出当前线程的名字 和 钱款剩余

        }
}

}

main 方法:
public class TestAccount {

public static void main(String[] args) {
    // 创建两个线程,模拟两个用户
    Runnable runnable = new AccountRunnable();
    Thread thread1 = new Thread(runnable, "张三");
    Thread thread = new Thread(runnable, "张三的妻子");
   /*thread1.setName("hun");
   thread.setName("wi");*/
    //  启动两个线程,模拟两个用户取款
    thread1.start();
    thread.start();
}

}

当thread1.start(); 方法在thread.start();方法之上时 遇到了问题 只有张三可以取款成功 如图:

img

而thread.start 方法在 thread1.start(); 之上时 却运行正常 如图:

img

img

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2021-09-30 17:27
    关注

    首先线程是异步的,在主程序中执行的先后顺序,并不能决定子线程执行的先后顺序。
    你程序是资源共享的情况,并没有保证线程安全。输出的结果错乱很正常。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月8日
  • 已采纳回答 9月30日
  • 修改了问题 9月30日
  • 修改了问题 9月30日
  • 展开全部

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名