どのようにJavaでのループのためにparallellizeするためにマルチスレッドを使用するには?

バーラトDangi:

私は、ファイルから複数のAPI呼び出しの詳細をピックアップし、1によって、それらのものを実行し、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());
        }
    }

より多くのAPIコールがあるように、これはすべてのコールの応答時間の合計を取っています。私は、これらの呼び出しは、並列に実行すると、私はさらに使用することができますArrayListの中で応答データを格納したいです。私は缶誰かがこれで私を助けてください、そうするJavaに新しいですか?

マルコ・R:

あなたは、並列ストリームを使用することができます。次の呼び出しは、並行して起動しますcreateAPICallDetails(idx)とに彼らのリターンオブジェクトを追加しますList

    List<APICallDetails> result = IntStream.range(0, callsCount)
            .parallel()
            .mapToObj(idx -> createAPICallDetails(idx))
            .collect(Collectors.toList());

だから、あなたのために残された唯一の事はのロジックを実装することです:

    APICallDetails createAPICallDetails(int index) { ... }

あなたの単一のオブジェクトを作成するにはAPICallDetails与えられたindex引数を、それは前のラムダで使用することができます。

お役に立てれば。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=200608&siteId=1