我有一个项目,其中我有一个" 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;条件,但循环不等待条件完成。
答案 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();
}