Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程似乎随着更多线程的添加而加速_Java_Multithreading - Fatal编程技术网

Java线程似乎随着更多线程的添加而加速

Java线程似乎随着更多线程的添加而加速,java,multithreading,Java,Multithreading,我遇到了一些奇怪的事情-使用下面给出的程序,我可以创建j个线程,这些线程开始并打印它们的计数器值(无论给定哪个线程数),然后计数到10亿,然后停止并打印它们的计数器值以及线程完成我关心的部分的执行所花费的时间。这是我的密码: public static void main(String []args){ for(int j=0;j<200;j++){ final int x = j; new Thread(()->{

我遇到了一些奇怪的事情-使用下面给出的程序,我可以创建
j
个线程,这些线程开始并打印它们的计数器值(无论给定哪个线程数),然后计数到10亿,然后停止并打印它们的计数器值以及线程完成我关心的部分的执行所花费的时间。这是我的密码:

 public static void main(String []args){
     
     for(int j=0;j<200;j++){
         final int x = j;
         new Thread(()->{
             System.out.println("start " + x);
             
             try{Thread.sleep(500);}catch(Exception e){}//this lets all the threads be created before running any calculations
             
             long a = System.nanoTime();
             for(int i=0;i<1000000000;i++){
                 
             }
             long b = System.nanoTime();
             
             System.out.println("stop " + x + " : " + ((b-a))/1000000000.0);//outputs time in seconds
             
         }).start();
         
         
     }
 }
请注意,所有时间都大于0.003。但是,当创建多个线程时,会出现“正常”时间(类似于上面的时间),但大部分时间的顺序是10^-5-以下是输出的一个片段:

stop 49 : 1.09E-5
stop 13 : 2.81E-5
stop 2 : 1.98E-5
stop 18 : 6.4E-6
stop 19 : 0.0616381
stop 7 : 0.0575055
stop 14 : 0.0648309
我的问题是——当您添加更多线程时,它们的执行时间怎么可能变得更短?当添加更多要执行的线程时,它们平均花费的时间会更长,这难道不符合逻辑吗?我很确定这不是一个波动性问题——每个线程应该只能接触到与自身相关的数据


可能需要注意的是,我在一台配备4 GHz六核处理器和17+GB未使用RAM的计算机上运行此程序,运行程序时,请使用-Djava.compiler=NONE关闭JIT。如果这给了您统一的执行时间,那么您可以将较低的执行时间归因于JITing。否则,您可以进一步研究。

可能您的操作被缓存到内存部分,这对所有线程都是可见的?可能是JIT人工制品?最好是用做实际工作的线程重复它。一个好的编译器会完全摆脱for循环,因为它什么也不做。但我倾向于相信,它后来会被JIT淘汰。是的,它似乎与JIT有关。我已经让线程做了实际的工作(我声明p=2.59838,然后在循环中我乘以然后除以5.285793-这些数字是任意的),现在时间都非常一致。现在我很好奇为什么一些线程会受到JIT的影响,而其他线程似乎不在我的原始示例中……这不仅仅是JIT编译——它将特别是JVM“热”代码路径识别和优化(即循环展开等)。循环展开应该在编译时发生,而不是在运行。“热代码路径标识”或后缘计数器是JIT编译器的一部分。@J.J
javac
据我所知不执行展开。可以减少部署的规模,或者确保更快的构建时间。无论哪种方式,hotspot都会在运行时执行展开。
stop 49 : 1.09E-5
stop 13 : 2.81E-5
stop 2 : 1.98E-5
stop 18 : 6.4E-6
stop 19 : 0.0616381
stop 7 : 0.0575055
stop 14 : 0.0648309