jixiangdong1
2016-05-11 17:50
采纳率: 40%
浏览 1.1k
已采纳

各位大神帮忙看下一个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方法。希望对你有用图片说明

    点赞 评论
  • 千乘1 2016-05-11 20:47

    这是线程执行顺序问题,子线程都有延迟。
    你的这句话只有在休眠一段时间后再执行才能有效果

     if(a1.isAlive()==false&&a2.isAlive()==false){
    System.out.println("结束");
    }
    

    加个休眠试试不然没办法

     try {
                    Thread.sleep(100);
                    System.out.println("tatal"+a.getnum());
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    

    你想要线程同步,那输出结果也只能是1000,1000,3000;

    点赞 评论
  • havedream_one 2016-05-11 23:55
    a1.start();
    a2.start();
    System.out.println(a.getnum());//不一定是在a1,a2之后执行,很大的可能是先执行,然后执行a1,a2
    System.out.println("-------------" + a.getnum());//改成这样打印,就可以清除0是这里打印的
    
    
    点赞 评论
  • havedream_one 2016-05-11 23:58

    加一个CountDownLatch,这样等待a1和a2执行完就可以了

    http://blog.csdn.net/havedream_one/article/details/47276751

    点赞 评论
  • 一点媛艺 2016-05-12 00:07

    我把你的代码复制过去运行,发现是1000,1000,3000,也不是0,1000,3000

    点赞 评论

相关推荐 更多相似问题