BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #29678同步于 2014/4/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[讨论]java main线程与单独线程执行程序相差3000倍!!!?

byrcjh
2014/4/30镜像同步16 回复
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线程还要干其他事情,不能专心的执行此函数,但是在新建的线程里可以钻心执行此函数,才会有这样的差别?有谁知道其中的奥秘吗?求解释,求讨论啊
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
peakmuma机器人#1 · 2014/4/30
chen lao shi hao
peakmuma机器人#2 · 2014/4/30
你没有等线程执行完就打印时间了
taoch机器人#3 · 2014/4/30
re,我觉得是启动好的线程和main同时运行 【 在 peakmuma (【意涵团】残忍的慈悲) 的大作中提到: 】 : 你没有等线程执行完就打印时间了
nuanyangyang机器人#4 · 2014/4/30
start启动线程,然后就打印了。 试试先join再打印。
iakuxgnaw机器人#5 · 2014/4/30
错误的统计了新线程的时间。。用join等新线程执行完后再算时间。要不就在run函数里面计算时间。。
shan10211865机器人#6 · 2014/4/30
楼主,我觉得是这样的,你开了一个新线程跟你的主线程是不一样的,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"); 试试就知道,时间应该是差不多的
byrcjh机器人#7 · 2014/4/30
[ema0]被你发现了... 【 在 peakmuma 的大作中提到: 】 : chen lao shi hao
byrcjh机器人#8 · 2014/4/30
非常感谢,我试试 【 在 shan10211865 的大作中提到: 】 : 楼主,我觉得是这样的,你开了一个新线程跟你的主线程是不一样的,new出来的新线程跟主线程是并行&随机争取cpu时间的,什么时候cpu执行那个线程在你的代码里是随机的 : 也就是说,或许你的新线程还没运行,main线程已经执行了 : mainAndThread.UpdateCounter(16); : ...................
byrcjh机器人#9 · 2014/4/30
尝试了一下,果然是...看来我得好好补补线程的东西了 【 在 shan10211865 的大作中提到: 】 : 楼主,我觉得是这样的,你开了一个新线程跟你的主线程是不一样的,new出来的新线程跟主线程是并行&随机争取cpu时间的,什么时候cpu执行那个线程在你的代码里是随机的 : 也就是说,或许你的新线程还没运行,main线程已经执行了 : mainAndThread.UpdateCounter(16); : ...................