jixiangdong1 2016-05-11 17:50 采纳率: 0%
浏览 1083
已采纳

各位大神帮忙看下一个JAVA多线程问题

public class ttt
{ public static void main(String args[])
{
account a=new account();
person person1=new person();
person person2=new person();
person1.cunkuanjine=1000;
person2.cunkuanjine=2000;
person1.zhanghu=a;
person2.zhanghu=a;
Thread a1=new Thread(person1);
Thread a2=new Thread(person2);
a1.start();
a2.start();
System.out.println(a.getnum());
if(a1.isAlive()==false&&a2.isAlive()==false){
System.out.println("结束");

}

}
}
class account
{
private int mum=0;
public void setnum(int mum)
{
this.mum=mum+this.mum;
}
public int getnum()
{
return this.mum;
}

}
class person implements Runnable
{ public static Object obj=new Object();
private String name;
public int cunkuanjine;
public account zhanghu;
public void run()
{
synchronized(obj){
cunqian(cunkuanjine,zhanghu);

System.out.println(zhanghu.getnum());
}

 }
public String getName() 
{
    return name;
}

public void setName(String name)
{
    this.name = name;
}
public void cunqian(int a,account b)
{
    b.setnum(a);
}

}
初学者自己的代码是这样的 按照我想的输出结果应该是 3000 1000 3000 结束 但是为啥运行输出 0 1000 3000

  • 写回答

5条回答 默认 最新

  • 泰 戈 尔 博客专家认证 2016-05-12 00:53
    关注

    对于线程而言,虽然代码中确实使用了start方法,但这时仅仅是将线程作为ready状态而已。真正的线程工作还是取决于操作系统的,操作系统管理着计算机上所有的task,而这时具体执行哪一个线程需要靠它们的竞争或者计算机的调度策略,所以会有一定的偶然性。于是就有可能出现你上面的结果。个人建议如果想让一个线程在某一个线程之前执行就使用join方法。希望对你有用图片说明

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

报告相同问题?

悬赏问题

  • ¥15 数学建模——参会安排怎么做
  • ¥15 电脑键盘实现触摸功能
  • ¥25 matlab无法将表达式转换为双数组怎么解决?
  • ¥15 单片机汇编语言相关程序
  • ¥20 家用射频美容仪技术规格
  • ¥15 大家帮我看看为什么错了
  • ¥15 unity互动琴弦抖动效果
  • ¥15 做了个的二极管反向饱和电流测量电路,但是测试达不到效果
  • ¥15 nginx无证书访问https失败
  • ¥15 树莓派启动AP热点传入数据