回答編集履歴

1

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

2017/02/25 23:08

投稿

mit0223
mit0223

スコア3401

test CHANGED
@@ -41,3 +41,73 @@
41
41
  たとえば、処理3がデータベースへの問い合わせだったりする場合、前者では、x=1 に対するデータベースサーバから応答が返ってくるまでCPUは待つしかありませんが、後者であれば他のことができるかもしれません。
42
42
 
43
43
  したがって、どちらかというと、ストリーミングのほうが最適化の余地があるものと思われます。
44
+
45
+
46
+
47
+ ただし、parallel() を呼んで、並列モードにしないと、並列実行されません。
48
+
49
+ 以下にパイプラインを並列実行する例を示します。
50
+
51
+
52
+
53
+ ```java
54
+
55
+ import java.util.stream.LongStream;
56
+
57
+ import java.util.Random;
58
+
59
+ class test {
60
+
61
+ private static void safeSleep(int t) {
62
+
63
+ try{Thread.sleep(t);} catch(Exception e){}
64
+
65
+ }
66
+
67
+ public static void main(String argv[]) {
68
+
69
+ Random rnd = new Random();
70
+
71
+ LongStream.range(1, 10000).parallel()
72
+
73
+ .map(x -> {
74
+
75
+ int t = rnd.nextInt(10);
76
+
77
+ System.out.println("process1 x=" + x + " sleep " + t + "ms");
78
+
79
+ safeSleep(t);
80
+
81
+ return x;
82
+
83
+ })
84
+
85
+ .map(x -> {
86
+
87
+ int t = rnd.nextInt(10);
88
+
89
+ System.out.println("process2 x=" + x + " sleep " + t + "ms");
90
+
91
+ safeSleep(t);
92
+
93
+ return x;
94
+
95
+ })
96
+
97
+ .forEach(x -> {
98
+
99
+ int t = rnd.nextInt(10);
100
+
101
+ System.out.println("process3 x=" + x + " sleep " + t + "ms");
102
+
103
+ safeSleep(t);
104
+
105
+ return;
106
+
107
+ });
108
+
109
+ }
110
+
111
+ }
112
+
113
+ ```