Mat*_*tan 6 java algorithm performance multithreading loops
假设我给出了整数a,并且b形成了一个感兴趣的范围,其中的整数为[a,b]。该范围可以跨越10^9整数。f : N -> N我想对给定函数的所有整数的值求和a <= n <= b。范围非常大,所以我想使用多线程来完成此操作。
不太正式,我想并行化以下代码:
long sum = 0;
for (long n = a ; n <= b ; n++)
sum += f(n);
System.out.println(sum);
Run Code Online (Sandbox Code Playgroud)
理想情况下(至少在我看来),该范围将平均分配处理器可用的可用线程数(假设范围内f(n)每个线程的复杂性和运行时间几乎相同)。n这些值是完全独立的,并且f实际上可以是任何函数。例如,它可以输出数字的数字之和,但它实际上可以是任何东西,这只是一个例子。
在 Java 中使用多线程有没有一种通用的方法可以做到这一点?
这个特殊的用例非常适合并行流。请参阅Oracle 的教程。将java.util.stream.LongStream类用于 64 位整数流long。
你可以这样实现:
long sum = LongStream.rangeClosed(a, b)
.parallel()
.map(n -> f(n))
.sum();
System.out.println(sum);
Run Code Online (Sandbox Code Playgroud)