首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中使用多线程来并行化for循环?

如何在Java中使用多线程来并行化for循环?
EN

Stack Overflow用户
提问于 2019-05-23 07:39:18
回答 1查看 873关注 0票数 1

我正在编写一段代码,它从一个文件中选取多个API调用细节,并逐个执行这些细节,然后在ArrayList中提供响应数据。下面是我当前的代码。

代码语言:javascript
复制
ArrayList<APICallDetails> apiCallDetailsArray = new ArrayList<>();
APICallDetails apiCallDetails = new APICallDetails();
for (count= 1; count <= callsCount; count++){
        try{
            apiCallDetails = new APICallDetails();
            apiCallDetails.setName(property.getPropertyReader(callName+"_"+count+"_Name", propsFile));
            apiCallDetails.setHost(marketConfigs.getRawJson().get(property.getPropertyReader(callName+"_"+count+"_Host", propsFile)).toString().replaceAll("\"", ""));
            apiCallDetails.setPath(property.getPropertyReader(callName+"_"+count+"_Path", propsFile));
            apiCallDetails.setMethod(property.getPropertyReader(callName+"_"+count+"_Method", propsFile));
            apiCallDetails.setBody(property.getPropertyReader(callName+"_"+count+"_Body", propsFile));

            apiCallDetails = sendAPIRequest.mwRequestWithoutBody(apiCallDetails, marketConfigs);
            BufferedWriter out = null;
            try {
                out = new BufferedWriter ( new FileWriter ( "C:\\file"+count+".html"));
                    out.write("something");
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    logger.error(new Date()+" - Error in "+getClass()+".apiCallRequester() flow: "+e.toString());
                }

            apiCallDetailsArray.add(apiCallDetails);

        }catch(NullPointerException e){
            e.printStackTrace();
            logger.error(new Date()+" - Error in "+getClass()+".apiCallRequester() flow: "+e.toString());
        }
    }

因为有更多的API调用,所以这是所有调用的响应时间的总和。我希望这些调用并行运行,并将响应数据存储在ArrayList中,以便进一步使用。我是Java新手,有人能帮我一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 08:03:01

您可以使用并行流。下面的调用将并行调用createAPICallDetails(idx)并将它们的返回对象添加到List

代码语言:javascript
复制
    List<APICallDetails> result = IntStream.range(0, callsCount)
            .parallel()
            .mapToObj(idx -> createAPICallDetails(idx))
            .collect(Collectors.toList());

因此,留给您的唯一一件事就是实现以下逻辑:

代码语言:javascript
复制
    APICallDetails createAPICallDetails(int index) { ... }

在给定index参数的情况下创建APICallDetails的单个对象,以便可以在前面的lambda中使用它。

希望这能有所帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56266299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档