Java 中的 for 循环通常是多线程的

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 中使用多线程有没有一种通用的方法可以做到这一点?

mar*_*ran 9

这个特殊的用例非常适合并行流。请参阅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)