这里我使用Javaparallel流来迭代List并使用每个列表元素作为输入调用REST调用。我需要将REST调用的所有结果添加到我正在使用ArrayList
的集合中。下面给出的代码工作正常,除了ArrayList的非线程安全性会导致错误的结果,并且添加所需的同步会引起争用,从而破坏并行性的好处。
有人可以建议我在我的案例中使用并行流的正确方法。
public void myMethod() {
List<List<String>> partitions = getInputData();
final List<String> allResult = new ArrayList<String>();
partitions.parallelStream().forEach(serverList -> callRestAPI(serverList, allResult);
}
private void callRestAPI(List<String> serverList, List<String> allResult) {
List<String> result = //Do a REST call.
allResult.addAll(result);
}
答案 0 :(得分:6)
您可以使用map
代替forEach
进行操作 - 这将保证线程安全(从功能编程的角度来看更清晰):
List<String> allResult = partitions.parallelStream()
.map(this::callRestAPI)
.flatMap(List::stream) //flattens the lists
.collect(toList());
您的callRestAPI method
:
private void callRestAPI(List<String> serverList) {
List<String> result = //Do a REST call.
return result;
}
答案 1 :(得分:3)
我不会回避同步对private Audio mAudio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAudio = new Audio();
mAudio.startRecording();
}
public void stopRecording(){
if(mAudio != null){
mAudio.stopRecording();
}
}
的访问权限。鉴于您通过Rest访问远程服务,我怀疑同步成本可忽略不计。我会在你花时间优化之前测量效果。