回答編集履歴
1
パイプラインの並列実行例を追加
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
|
+
```
|