在 Java 中停止并继续循环 For 循环
Stop and Continue Looping of For Loop In Java
我有一个项目,在这个项目中我有一个 "for loop" 遍历数组列表。我需要在中间停止迭代并再次继续。我尝试通过在两者之间应用 "if else" 条件来做到这一点,但它没有用。
我有一个大小为 2500 的数组列表,我需要 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();
}
}
这是行不通的。循环不会停止,当我调试时它会在 "else" 条件下停止,但循环不会等待条件完成。
I have arraylist of size 2500 and i need for loop to iterate 500 times and then wait and call a function and again continue looping and stop after 500 and so on
创建一个临时列表以将每个项目添加到其中。使用 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();
}
}
代码基本正确;
... = new ArrayList<>(500);
会更好
在循环之后不要忘记发送余数:
if (!saveArrayList.isEmpty()) {
SentService.sendArraylist(saveArrayList);
saveArrayList.clear();
}
我不确定你到底在问什么,但我的猜测是你对 SentService.sendArraylist(saveArrayList)
的调用在它消耗 saveArrayList
之前做了 return,即它正在使用线程和您自己的代码不是线程安全的。为了避免这种情况,您可以使用如下所示的模式。
注意:这可能完全是胡说八道,因为我真的不知道这是否确实是您的问题...
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();
}
}
我有一个项目,在这个项目中我有一个 "for loop" 遍历数组列表。我需要在中间停止迭代并再次继续。我尝试通过在两者之间应用 "if else" 条件来做到这一点,但它没有用。
我有一个大小为 2500 的数组列表,我需要 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();
}
}
这是行不通的。循环不会停止,当我调试时它会在 "else" 条件下停止,但循环不会等待条件完成。
I have arraylist of size 2500 and i need for loop to iterate 500 times and then wait and call a function and again continue looping and stop after 500 and so on
创建一个临时列表以将每个项目添加到其中。使用 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();
}
}
代码基本正确;
... = new ArrayList<>(500);
会更好
在循环之后不要忘记发送余数:
if (!saveArrayList.isEmpty()) {
SentService.sendArraylist(saveArrayList);
saveArrayList.clear();
}
我不确定你到底在问什么,但我的猜测是你对 SentService.sendArraylist(saveArrayList)
的调用在它消耗 saveArrayList
之前做了 return,即它正在使用线程和您自己的代码不是线程安全的。为了避免这种情况,您可以使用如下所示的模式。
注意:这可能完全是胡说八道,因为我真的不知道这是否确实是您的问题...
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();
}
}