Java有类似于c ++可组合的东西吗?

时间:2015-10-09 13:34:55

标签: java c++ multithreading

我正在使用.parallelStream().forEach()对数据库执行大量写操作,但是还要保留我编写的行数。

现在,我有java.util.concurrent.atomic.AtomicInteger来跟踪计数,但我想使用类似于c ++ combinable<>的内容。

this article中,有一个使用combinable<>的例子:

#include <iostream>
#include <cstdint>
#include <ppl.h>

using namespace Concurrency;

const int max_sum_item = 1000000000;

int main()
{
    combinable<uint64_t> part_sums([] { return 0; });

    parallel_for(0, max_sum_item,
        [&part_sums] (int i)
        {
            part_sums.local() += i;
        }
    );

    uint64_t result = part_sums.combine(std::plus<uint64_t>());

    if (result != uint64_t(499999999500000000))
        throw;
}

Java中是否有等效的combinable<>类?

Java code snippet:

AtomicInteger totalRows = new AtomicInteger(0);
...
myList.parallelStream().forEach(
    ... // write to db
    totalRows.addAndGet(rowsWritten);
    ...
);

print(totalRows.get());

寻找类似的东西:

Combinable<int> totalRows = new Combinable<>(0);
...
myList.parallelStream().forEach(
    ... // write to db
    totalRows = rowsWritten;
    ...
);

print(totalRows.combine());

编辑:根据@ zero323,Spark中的正确工具将是Accumulator。我对多线程案例更感兴趣,但手头没有非Spark示例。

EDIT2:更新了示例(并删除了Spark引用)

1 个答案:

答案 0 :(得分:2)

Spark中的正确工具是Accumulator

Accumulator<Integer> accum = sc.accumulator(0);

myRDD.parallelStream().forEach(
    accum.add(1);
);

accum.value();

累加器从工作者的角度来看是只写的,只能由驱动程序读取。默认情况下,它仅支持LongDoubleFloat,但您可以实现自定义AccumulatorParam以支持其他类型。