【问题标题】:ParallelStreams in javajava中的并行流
【发布时间】:2015-09-25 22:54:43
【问题描述】:

我正在尝试使用并行流来调用 API 端点以取回一些数据。我正在使用ArrayList<String> 并将每个字符串发送到一个方法,该方法使用它来调用我的 API。我已经设置了并行流来调用一个方法,该方法将调用端点并编组返回的数据。对我来说问题是,当在 htop 中查看这个时,我看到数据库服务器上的所有核心都亮起,第二次我点击这个方法......然后当第一组完成时,我看到 1 或 2 个核心亮起。我的问题是,我认为我真的得到了我想要的结果......仅针对第一组呼叫,然后从监控来看,其余呼叫似乎一次完成一个。

我认为这可能与递归有关,但我不是 100% 确定。

private void generateObjectMap(Integer count){
    ArrayList<String> myList = getMyList();
    myList.parallelStream().forEach(f -> performApiRequest(f,count));
}

private void performApiRequest(String myString,Integer count){
    if(count < 10) {
        TreeMap<Integer,TreeMap<Date,MyObj>> tempMap = new TreeMap();
        try {
            tempMap = myJson.getTempMap(myRestClient.executeGet(myString);
        } catch(SocketTimeoutException e) {
            count += 1;
            performApiRequest(myString,count);
        }
        ...
    else {
        System.exit(1);
    }
}

【问题讨论】:

    标签: java multithreading parallel-processing java-stream


    【解决方案1】:

    这似乎是并行流的不寻常用途。一般来说,您正在通知 JVM,流上的操作是真正独立的,并且可以在一个或多个线程中以任何顺序运行。随后将减少或收集结果作为流的一部分。这里要记住的重要一点是副作用是未定义的(这就是为什么在流中更改的变量需要是最终或有效最终的),您不应该依赖 JVM 如何组织操作的执行。

    我可以想象以下是合理的用法:

    list.parallelStream().map(item -> getDataUsingApi(item))
        .collect(Collectors.toList());
    

    api 返回数据的地方,然后将其交给下游操作,没有副作用。

    因此,总而言之,如果您想严格控制 api 调用的执行方式,我建议您不要为此使用并行流。传统的 Thread 实例,可能带有 ThreadPoolExecutor 会更好地为您服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      相关资源
      最近更新 更多