返回信息流目的:用`CompletionService`来处理任务列表(`ArrayList`,当时选择的是这个,应该用`LinkedList`会好一些),任务是一个封装的`htpp`请求任务,根据任务返回结果判断是否重试。但是代码在执行的时候,部分任务显示了"remove taskId: [" + taskId + "]"后,仍执行了`reTry`次。求大神指导一下哪里出问题了。代码如下:
```java
//CompletionService来执行并发任务
public void runTasks(int reTry) {
while (!taskList.isEmpty() && reTry > 0) {
--reTry; // 重试
for (Task task : taskList) {
completionService.submit(new CallableTask(task));
}
// 处理返回结果
Iterator<Task> beg;
for (int i = 0; i < taskList.size(); i++) {
try {
Future<String> ret = completionService.take();
String result = ret.get();
if (!result.startsWith("ERROR")) {
int taskId = Integer.parseInt(result.substring(SUCCESS_FLAG_LEN).trim());
System.out.println("run taskId: [" + taskId + "] successful, result: " + result);
// 刪除任务
beg = taskList.iterator();
while (beg.hasNext()) {
Task task = beg.next();
if (task.getId() == taskId) {
beg.remove();
System.out.println("remove taskId: [" + taskId + "]");
break;
}
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
```
这是一条镜像帖。来源:北邮人论坛 / java / #52101同步于 2016/8/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求助CompletionService处理list任务问题
SparksFly
2016/8/1镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
问题出现在你用iterator遍历删除你的任务。每删除一个任务,taskList中被删除元素右侧的所有元素都要向前移动一位,相应的你的taskList的size也会减一。所以会造成有点任务到最后删不掉。比如你有10个任务,你删除了其中的五个,现在你的size是5,但是现在的for循环中i也是5,所以你的taskList一直不为空,所以还要执行retry次
```java
int len = taskList.size();
for (int i = 0; i < len; ++i)
```
这样应该就OK了把?
【 在 mh250303135 的大作中提到: 】
: 问题出现在你用iterator遍历删除你的任务。每删除一个任务,taskList中被删除元素右侧的所有元素都要向前移动一位,相应的你的taskList的size也会减一。所以会造成有点任务到最后删不掉。比如你有10个任务,你删除了其中的五个,现在你的size是5,但是现在的for循环中i也是5,所以你的taskList一直不为空,所以还要执行retry次
【 在 SparksFly 的大作中提到: 】
: [md]
: ```java
: int len = taskList.size();
: ...................
应该可以了
我试试去,感谢。当时连这个比较基本的问题都没考虑清楚,惭愧
【 在 mh250303135 (javazealots) 的大作中提到: 】
: 应该可以了