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

如何在Java中使用多线程并行化for循环?,java,multithreading,algorithm,design-patterns,java-8,Java,Multithreading,Algorithm,Design Patterns,Java 8,我正在编写一段代码,它从一个文件中提取多个API调用细节并逐个执行这些细节,并在ArrayList中提供响应数据。下面是我当前的代码 ArrayList<APICallDetails> apiCallDetailsArray = new ArrayList<>(); APICallDetails apiCallDetails = new APICallDetails(); for (count= 1; count <= callsCount; count++){

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

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());
        }
    }
ArrayList apiCallDetailsArray=new ArrayList();
APICallDetails APICallDetails=新的APICallDetails();

对于(count=1;count您可以使用并行流。以下调用将并行调用
createAPICallDetails(idx)
,并将其返回对象添加到
列表中:

    List<APICallDetails> result = IntStream.range(0, callsCount)
            .parallel()
            .mapToObj(idx -> createAPICallDetails(idx))
            .collect(Collectors.toList());
在给定
index
参数的情况下,创建
APICallDetails
的单个对象,以便在前面的lambda中使用


希望这有帮助。

您可以使用并行流。以下调用将并行调用
createAPICallDetails(idx)
,并将其返回对象添加到
列表中

    List<APICallDetails> result = IntStream.range(0, callsCount)
            .parallel()
            .mapToObj(idx -> createAPICallDetails(idx))
            .collect(Collectors.toList());
在给定
index
参数的情况下,创建
APICallDetails
的单个对象,以便在前面的lambda中使用


希望这能有所帮助。

展望CompletableFuture。这个for循环也有点过时。查看Streams API以获得更具表现力的迭代构造。(另外,流的并行化非常简单)。请注意,Java对象并非天生都是线程安全的,
sendAPIRequest
可能不喜欢被并行调用。查看CompletableFuture。这个for循环也有点过时。查看Streams API以获得更具表现力的迭代构造。(另外,流并行化很简单)。请注意,Java对象并非天生都是线程安全的,
sendAPIRequest
可能不喜欢被并行调用。谢谢,@Macro R.!!我已经尝试在我的代码中实现了这一点,我的日志中出现了错误,我的web应用程序正在所有页面上抛出404 HTTP状态。严重:异常发送上下文初始化类org.springframework.beans.factory.BeanDefinitionStoreException的侦听器实例的已化事件:未能读取候选组件类:文件[C:\Bharat\IDEs\JavaWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\R6TestKit\WEB-INF\classes\com\capgemini\controller\APICallController.class];嵌套的异常是java.lang.ArrayIndexOutOfBoundsException:153我共享的代码有效地并行运行了一个循环。我建议您创建一个新的不同问题,包含所有相关细节,因为这个新问题超出了当前问题的范围。感谢您的回复!!是的,我也同意这是一个完全不同的问题。B但不知何故,上述代码是导致此错误的唯一原因。当我从代码中删除此代码段时,一切都开始工作。每当我再次添加它时,它就会停止web应用程序的启动。请确保实现
APICallDetails createAPICallDetails(int index){…}
正确。例如,我给你的代码已经创建了
列表
并添加了所有元素,因此不需要
apiCallDetailsArray.add(apiCallDetails)
或任何列表操作,只需创建对象并返回它。谢谢Marco!!这对我帮助很大。我刚刚将代码从控制器移动到服务类,它开始工作。谢谢,@Macro R。!!我尝试在代码中实现这一点,方法是在日志中找到错误,我的web应用程序正在抛出404 HTTP状态on所有页面。严重:将上下文初始化事件发送到类org.springframework.beans.factory.BeanDefinitionStoreException的侦听器实例时发生异常:无法读取候选组件类:文件[C:\Bharat\IDEs\JavaWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\R6TestKit\WEB-INF\classes\com\capgemini\controller\APICallController.class];嵌套的异常是java.lang.ArrayIndexOutOfBoundsException:153我共享的代码有效地并行运行了一个循环。我建议您创建一个新的不同问题,包含所有相关细节,因为这个新问题超出了当前问题的范围。感谢您的回复!!是的,我也同意这是一个完全不同的问题。B但不知何故,上述代码是导致此错误的唯一原因。当我从代码中删除此代码段时,一切都开始工作。每当我再次添加它时,它就会停止web应用程序的启动。请确保实现
APICallDetails createAPICallDetails(int index){…}
正确。例如,我给你的代码已经创建了
列表
并添加了所有元素,因此不需要
apiCallDetailsArray.add(apiCallDetails)
或任何列表操作,只需创建对象并返回它。谢谢Marco!!这对我帮助很大。我刚刚将代码从控制器移动到服务类,它开始工作。