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日
  • 展开全部

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效