返回信息流public class MainAndThread {
private static int[] s_counter = new int[1024];
private void UpdateCounter(int position){
for(int j=0;j<1000000000;j++){
s_counter[position] = s_counter[position]+3;
}
}
public static void main(String[] args){
final MainAndThread mainAndThread = new MainAndThread();
long startTime = System.currentTimeMillis();
mainAndThread.UpdateCounter(16);
/*new Thread(new Runnable(){
@Override
public void run() {
mainAndThread.UpdateCounter(16);
}
}).start();*/
long stopTime = System.currentTimeMillis();
System.out.println((stopTime-startTime)+"ms");
}
}
如上所示:程序在main函数中执行UpdateCounter()函数的时候,需要3000多毫秒(这个在不同电脑上有差别,但是数量级好像不变),但是在main函数中新建立一个线程执行相同的接口,却只要1ms。
我猜测是因为main线程还要干其他事情,不能专心的执行此函数,但是在新建的线程里可以钻心执行此函数,才会有这样的差别?有谁知道其中的奥秘吗?求解释,求讨论啊
这是一条镜像帖。来源:北邮人论坛 / java / #29678同步于 2014/4/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[讨论]java main线程与单独线程执行程序相差3000倍!!!?
byrcjh
2014/4/30镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
楼主,我觉得是这样的,你开了一个新线程跟你的主线程是不一样的,new出来的新线程跟主线程是并行&随机争取cpu时间的,什么时候cpu执行那个线程在你的代码里是随机的
也就是说,或许你的新线程还没运行,main线程已经执行了
mainAndThread.UpdateCounter(16);
long stopTime = System.currentTimeMillis();
System.out.println((stopTime-startTime)+"ms");
这三句代码,所以一毫秒 所以向楼上们说的那样
在新线程的run()方法里面开头和结尾加上
mainAndThread.UpdateCounter(16);
和
long stopTime = System.currentTimeMillis();
System.out.println((stopTime-startTime)+"ms");
试试就知道,时间应该是差不多的
非常感谢,我试试
【 在 shan10211865 的大作中提到: 】
: 楼主,我觉得是这样的,你开了一个新线程跟你的主线程是不一样的,new出来的新线程跟主线程是并行&随机争取cpu时间的,什么时候cpu执行那个线程在你的代码里是随机的
: 也就是说,或许你的新线程还没运行,main线程已经执行了
: mainAndThread.UpdateCounter(16);
: ...................
尝试了一下,果然是...看来我得好好补补线程的东西了
【 在 shan10211865 的大作中提到: 】
: 楼主,我觉得是这样的,你开了一个新线程跟你的主线程是不一样的,new出来的新线程跟主线程是并行&随机争取cpu时间的,什么时候cpu执行那个线程在你的代码里是随机的
: 也就是说,或许你的新线程还没运行,main线程已经执行了
: mainAndThread.UpdateCounter(16);
: ...................