Java 8 parallelStream用于并发数据库/ REST调用

时间:2015-06-10 13:49:27

标签: java multithreading concurrency parallel-processing java-8

这里我使用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);
}

2 个答案:

答案 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访问远程服务,我怀疑同步成本可忽略不计。我会在你花时间优化之前测量效果。