Java是否有类似于c++';什么是可组合的?

Java是否有类似于c++';什么是可组合的?,java,c++,multithreading,Java,C++,Multithreading,我正在使用.parallelStream().forEach()对数据库进行一系列写入操作,但也希望记录我所写入的行数 现在,我有一个java.util.concurrent.AtomicInteger来跟踪计数,但我想使用类似于c++的combinable的东西 在中,有一个使用可组合的的示例: 寻找类似于: Combinable<int> totalRows = new Combinable<>(0); ... myList.parallelStream().forE

我正在使用
.parallelStream().forEach()
对数据库进行一系列写入操作,但也希望记录我所写入的行数

现在,我有一个
java.util.concurrent.AtomicInteger
来跟踪计数,但我想使用类似于c++的
combinable
的东西

在中,有一个使用可组合的
的示例:

寻找类似于:

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

print(totalRows.combine());
Combinable totalRows=new Combinable(0);
...
myList.parallelStream().forEach(
…//写入数据库
totalRows=RowsWrited;
...
);
打印(totalRows.combine());
编辑:根据@zero323,Spark中的正确工具应该是一个。我对多线程的情况更感兴趣,但手头没有一个非Spark示例


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

Spark中的正确工具应该是:

累加器accum=sc.累加器(0);
myRDD.parallelStream().forEach(
累计增加(1);
);
累计值();

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

听起来不错。我试图针对任何多线程场景回答这个问题,但遗憾的是,我没有一个非Spark场景。Spark实际上是非常具体的场景,其中累加器实际上是唯一干净的选项。如果你有Scala样集合API,比较好的方法是在并行映射中产生副作用,返回指示符并减少。这可能是挑剔的,但它不是“C++的可组合”,因为它不是任何C++标准的一部分。
并发
名称空间是微软对其并发运行时的抽象的一部分,因此也不可移植。
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());
Accumulator<Integer> accum = sc.accumulator(0);

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

accum.value();