如果我有一个简单的程序来并行计算从0到9的随机整数计数1的数量进行大量迭代,我该如何使用sum函数减少计数1(numOnes)的变量,这样我我可以在我的程序中使用总和。
这相当于OpenMP中的reduction指令。
public void run() {
long work = total_iterations / threads;
long numOnes = 0;
for (long i = 0; i < work; i++) {
int randomNum = rand.nextInt(9);
if (randomNum == 1) {
numOnes += 1;
}
}
}
每个线程执行完毕后,我希望能够使用包含聚合结果的numOnes。
答案 0 :(得分:0)
在Java中,您必须坐下来手动管理事物。换句话说:假设您的数据是分区的,那么您只需踢出这10个线程,然后让它们完成工作。
最后,您希望 join 所有这些主题;如:在所有线程“加入”时;所有这些都完成了;并且您已准备好继续前进并处理他们的结果。
或者,你会研究更多“抽象”的东西,比如ExecutorService和Futures;远离直接处理“裸机”线程。
当然这很通用;但是,你的问题也是如此。
答案 1 :(得分:0)
You could use streams for this.
public class ParallelInts
{
public static void main(String[] args) {
int count = new Random().ints( 1_000_000, 0, 10 ).parallel()
.reduce( 0, (sum, i) -> sum + ((i==1)?1:0) );
System.out.println( "count = " + count );
}
}