2 jixiangdong1 jixiangdong1 于 2016.05.12 01:50 提问

各位大神帮忙看下一个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个回答

Marksinoberg
Marksinoberg   Ds   Rxr 2016.05.12 08:53
已采纳

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

qq_34920350
qq_34920350   2016.05.12 04: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
havedream_one   2016.05.12 07:55
a1.start();
a2.start();
System.out.println(a.getnum());//不一定是在a1,a2之后执行,很大的可能是先执行,然后执行a1,a2
System.out.println("-------------" + a.getnum());//改成这样打印,就可以清除0是这里打印的

havedream_one
havedream_one   2016.05.12 07:58

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

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

qq_34966875
qq_34966875   2016.05.12 08:07

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!