2016-03-24 7 views
-1

私は方法1を使用するときにかかる時間を測定した(方法2)のJava - Javaの8 parallelStream及び作成スレッド自身を

をジャワ8のparallelStream(法1)を使用して並列スレッドを作成するの差を検索しようとしていたとの違い方法2しかし、私は大きな偏差を発見した。方法2(〜700ms)法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つのコアを言っている場合、それは並列 – user7

+0

user7 @あなたはしかし、あなたは '-Djava.util.concurrentを設定することができます実行している以上の4つのスレッドを持つことが可能です。 ForkJoinPool.common.parallelism = 'ただし、これはCPUバインドタスクには最適ではありません。 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html –

+1

java8のparallelStreamを使用する場合、ループの繰り返しごとに1つのスレッドは作成されませんか?しかし、method2を使うときは、そのような振る舞いを強制しますか? – user7