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();