打卦两个反面什么意思:帮帮忙!java中多线程运行累加和程序问题

来源:百度文库 编辑:高校问答 时间:2024/04/28 17:09:46
class a implments Runable{
int i=0;
int s=0;
public void run(){
while(i<30000){
s=s+i;
i++;
System.out.println(s);
}
}
}
class b{
public static void main(String [] args){
a p=new a();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
}
}
经过我用表计算,表论有多少条 new Thread(p).start();最后结果出来后,程序运行的时间都是一样的,请问问题出现在哪呢

关键就在于你只new了一个a
new Thread(p).start();
只是启动了一个线程,无论你执行多少次new Thread(p).start();这些被启动的线程都“共享”域i

因为循环次数大致一样,不论new Thread(p).start();有多少,i++这行语句都大约执行了30000次,如果只有一个new,则在一个线程中执行30000次i++,如果有2个new,在两个线程中一共执行大约30000次i++,每个线程不可能执行30000次i++,因为另外一个现成的i++也会改变i的值。

关键一点是,循环变量在各个线程中都是相同的,是同一个i,所以总循环次数是大致一样的。

之所以说大致一样,是因为在i++执行过程中线程调度的几率很小。如果恰好在这个时候调度,那么循环次数就不会是30000