Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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_Parallel Processing - Fatal编程技术网

Java 当线程数大于内核数时,简单的并行计算可以获得更好的结果

Java 当线程数大于内核数时,简单的并行计算可以获得更好的结果,java,multithreading,parallel-processing,Java,Multithreading,Parallel Processing,我有一个简单的Java应用程序,它基本上将计数器增加6亿次。我将此任务分为几个线程,每个线程递增自己的计数器,最后对这些计数器求和。 奇怪的是,拥有比内核更多的线程可以获得更好的性能: 平均计算时间示例(在六核英特尔I7-9850H上): 有6个线程,每个线程的增量为100M,产生97ms 具有60个线程,每个线程的增量为10M,产生61 ms AFAIK Java将每个线程映射到一个真正的系统线程。 知道为什么会发生这种情况吗? 编辑: 原因是否可能是我的计算机有许多其他正在运行的进程和线

我有一个简单的Java应用程序,它基本上将计数器增加6亿次。我将此任务分为几个线程,每个线程递增自己的计数器,最后对这些计数器求和。
奇怪的是,拥有比内核更多的线程可以获得更好的性能:

平均计算时间示例(在六核英特尔I7-9850H上):

  • 有6个线程,每个线程的增量为100M,产生97ms
  • 具有60个线程,每个线程的增量为10M,产生61 ms
AFAIK Java将每个线程映射到一个真正的系统线程。
知道为什么会发生这种情况吗?

编辑
原因是否可能是我的计算机有许多其他正在运行的进程和线程,因此60个线程与所有其他驻留线程的竞争比只有6个线程在CPU资源上竞争要好

增量法的代码:

private static void incrementWithLockFree(long increments, int threads) throws InterruptedException {
    final long[] numbers = new long[threads];
    ExecutorService threadPool = Executors.newFixedThreadPool(threads);
    for (int task = 0; task < threads; task++) {
      int finalTask = task;
      threadPool.submit(() -> {
        for (long increment = 0; increment < increments; increment++) {
          numbers[finalTask]++;
        }
      });
    }
    threadPool.shutdown();
    threadPool.awaitTermination(1, TimeUnit.DAYS);
    long number = 0;
    for (long num : numbers) {
      number += num;
    }
    System.out.println(number);
  }
private static void incrementWithLockFree(长增量,int线程)抛出中断异常{
最终长[]个数=新长[螺纹];
ExecutorService线程池=Executors.newFixedThreadPool(线程);
for(int task=0;task{
对于(长增量=0;增量<增量;增量++){
数字[最终任务]+;
}
});
}
threadPool.shutdown();
线程池。等待终止(1,时间单位。天);
长数=0;
for(长数值:数字){
数字+=num;
}
系统输出打印项次(编号);
}

在我的系统上,线程越少,性能越好

原因是否可能是我的计算机有许多其他正在运行的进程和线程,因此60个线程与所有其他驻留线程的竞争比只有6个线程在CPU资源上竞争要好

如果这是一个真实的用例,请看一看,它针对多线程计数器场景进行了优化