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条)

报告相同问题?

悬赏问题

  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥200 求能开发抖音自动回复卡片的软件
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。