2016-03-24 72 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