2016-03-24 64 views
-1

我试图找到我测量使用方法1时所用的时间使用Java 8的parallelStream(方法1)和创建并行线程(方法2)爪哇 - 爪哇8 parallelStream和创建线程自己

之间的差之间的差异方法2.但我发现一个巨大的偏差。方法2(〜700毫秒)比方法1(〜20秒)

方法1的方式更快:(列表具有约100条)

list.parallelStream() 
    .forEach(ele -> { 
     //Do something. 
    })); 

方法2:

for(i = 0;i < 100; i++) { 
    Runnable task =() -> { 
    //Do something. 
    } 
    Thread thread = new Thread(task); 
    thread.start(); 
} 

注意:做一些事情是一个昂贵的操作,如击中数据库。

我将System.out.println()消息添加到两者。我发现方法1(parallelStream)出现顺序执行,而在方法2中,消息打印速度非常快。

任何人都可以解释发生了什么。

回答

0

任何人都可以解释发生了什么。

很可能你做错了什么,但不清楚是什么。

for (int i = 0; i < 3; i++) { 
    long start = System.currentTimeMillis(); 
    IntStream.range(0, 100).parallel() 
      .forEach(ele -> { 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException ignored) { 
       } 
      }); 
    long time = System.currentTimeMillis() - start; 
    System.out.printf("Took %,d ms to perform 100 tasks of 100 ms on %d processors%n", 
      time, Runtime.getRuntime().availableProcessors()); 
} 

打印

Took 475 ms to perform 100 tasks of 100 ms on 32 processors 
Took 401 ms to perform 100 tasks of 100 ms on 32 processors 
Took 401 ms to perform 100 tasks of 100 ms on 32 processors 
+0

如果我们有说4个核心,是有可能有超过4个线程平行运行 – user7

+0

@ user7你可以,但你必须设置'-Djava.util.concurrent。 ForkJoinPool.common.parallelism ='但是这对于任何CPU绑定任务来说都不是最优的。 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html –

+1

所以,当使用java8的parallelStream时,一个线程将不会为循环的每次迭代创建吗?但是当使用方法2时,我们强制这样的行为? – user7