如何并行化创建复杂对象的步骤?

时间:2016-04-06 10:51:52

标签: java concurrency parallel-processing

class MyItem {
    private param1, param2, param3;
}

MyItem item = new MyItem();

computeParam1(item);
computeParam2(item);
computeParam3(item);
waitForAllParamsToBeSet();

每个步骤彼此独立,每个步骤将参数写入对象作为最终结果。 这些方法与它们的逻辑完全不同,没有递归。

如果可能的话,我如何并行化这些步骤?

3 个答案:

答案 0 :(得分:3)

启动Futures,然后在分配前等待结果。

setTimout

答案 1 :(得分:2)

由于所有computeParamX()接受一个MyItem参数且返回无效,因此它们具有Consumer<MyItem>的签名。因此,您可以将它们的执行并行化,并在.forEach()并行流中调用它们,如下所示:

final MyItem item = new MyItem();
Stream.<Consumer<MyItem>>of(this::computeParam1, this::computeParam2, this::computeParam3)
          .parallel()
          .forEach(c -> c.accept(item));

由于.forEach()是终端操作,它将阻塞直到所有操作完成,因此您可以在返回后安全地使用item对象。

答案 2 :(得分:2)

在Java 8中,您可以简单地创建下一个任务集合:

Collection<Runnable> tasks = Arrays.asList(
    () -> System.out.println("Compute param1"),
    () -> System.out.println("Compute param2"),
    () -> System.out.println("Compute param3")
);

然后并行启动任务

tasks.parallelStream().forEach(Runnable::run);