teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

パイプラインの並列実行例を追加

2017/02/25 23:08

投稿

mit0223
mit0223

スコア3401

answer CHANGED
@@ -19,4 +19,39 @@
19
19
  となっていれば、 x=1 の処理1と同時に(場合によって) x=2 の処理1が始められます。
20
20
 
21
21
  たとえば、処理3がデータベースへの問い合わせだったりする場合、前者では、x=1 に対するデータベースサーバから応答が返ってくるまでCPUは待つしかありませんが、後者であれば他のことができるかもしれません。
22
- したがって、どちらかというと、ストリーミングのほうが最適化の余地があるものと思われます。
22
+ したがって、どちらかというと、ストリーミングのほうが最適化の余地があるものと思われます。
23
+
24
+ ただし、parallel() を呼んで、並列モードにしないと、並列実行されません。
25
+ 以下にパイプラインを並列実行する例を示します。
26
+
27
+ ```java
28
+ import java.util.stream.LongStream;
29
+ import java.util.Random;
30
+ class test {
31
+ private static void safeSleep(int t) {
32
+ try{Thread.sleep(t);} catch(Exception e){}
33
+ }
34
+ public static void main(String argv[]) {
35
+ Random rnd = new Random();
36
+ LongStream.range(1, 10000).parallel()
37
+ .map(x -> {
38
+ int t = rnd.nextInt(10);
39
+ System.out.println("process1 x=" + x + " sleep " + t + "ms");
40
+ safeSleep(t);
41
+ return x;
42
+ })
43
+ .map(x -> {
44
+ int t = rnd.nextInt(10);
45
+ System.out.println("process2 x=" + x + " sleep " + t + "ms");
46
+ safeSleep(t);
47
+ return x;
48
+ })
49
+ .forEach(x -> {
50
+ int t = rnd.nextInt(10);
51
+ System.out.println("process3 x=" + x + " sleep " + t + "ms");
52
+ safeSleep(t);
53
+ return;
54
+ });
55
+ }
56
+ }
57
+ ```