如何在Java线程中应用reduce函数?

时间:2017-04-06 16:35:59

标签: java multithreading parallel-processing

如果我有一个简单的程序来并行计算从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。

2 个答案:

答案 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 );
   }
}