停止并继续循环Java中的For循环

时间:2015-04-29 16:25:03

标签: java for-loop wait

我有一个项目,其中我有一个" for循环"迭代一个arraylist。我需要在两者之间停止迭代并再次继续。我尝试通过应用" if else"两者之间的条件,但它没有工作。

我有一个大小为2500的arraylist,我需要for循环迭代500次,然后等待并调用一个函数再次继续循环并在下一个500之后停止等等。

这是我到目前为止所尝试的内容:

int msgCount = 0;
ArrayList<JSONInput > saveArrayList = new ArrayList<JSONInput >();

for(JSONInput jsonInput: arrXMLString){          
    publisher.send(jsonInput);
    saveArrayList.add(jsonInput);

    if(msgCount<500){  // it will loop for 500 times and increment msgCount
        msgCount++;  
    } else {                              
        msgCount=0;
        SentService.sendArraylist(saveArrayList);  
        saveArrayList.clear(); 
    }
}

这不起作用。循环不会停止,当我调试它时会停止在&#34; else&#34;条件,但循环不等待条件完成。

3 个答案:

答案 0 :(得分:3)

  

我有大小为2500的arraylist,我需要循环迭代500次然后等待并调用一个函数再次继续循环并在500之后停止等等

创建临时列表以添加每个项目。使用for循环并检查循环的索引值 - 如果此值可被500整除,则调用必要的代码。

//presuming arrXMLString is a List 
List<JSONInput> saveArrayList = new ArrayList<JSONInput>();
for ( int i = 0; i < arrXMLString.size(); i++ ){
    JSONInput jsonInput = arrXMLString.get(i);
    publisher.send(jsonInput);
    saveArrayList .add(jsonInput);
    if ( i % 500 == 0 && i > 0 ){
        SentService.sendArraylist(tempList);  
        saveArrayList .clear();
    }
}

答案 1 :(得分:1)

我不确定你的实际问题是什么,但我的猜测是你的SentService.sendArraylist(saveArrayList)调用确实在它消耗saveArrayList之前返回,即它使用了Threads并且你自己的代码不是Thread安全。为了避免这种情况,您可以使用如下所示的模式。

注意:这可能是完整的bollocks,因为我真的不知道这确实是你的问题......

int msgCount = 0;
ArrayList<JSONInput > saveArrayList = new ArrayList<JSONInput >();

for(JSONInput jsonInput: arrXMLString){          
    publisher.send(jsonInput);
    saveArrayList.add(jsonInput);

    if(msgCount<500){  // it will loop for 500 times and increment msgCount
        msgCount++;  
    } else {                              
        msgCount=0;
        SentService.sendArraylist(saveArrayList); 

        //poll for expected result
        while (Whatever you need to check){
           Thread.sleep(500); //depends on how long you expect async sendArraylist takes
        } 
        saveArrayList.clear(); 
    }
}

答案 2 :(得分:0)

代码几乎是正确的;

... = new ArrayList<>(500);

会更好。

在循环之后,人们不应忘记发送余数:

if (!saveArrayList.isEmpty()) {
    SentService.sendArraylist(saveArrayList);
    saveArrayList.clear();
}