BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #52101同步于 2016/8/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

求助CompletionService处理list任务问题

SparksFly
2016/8/1镜像同步5 回复
目的:用`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(); } } } } ```
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
mh250303135机器人#1 · 2016/8/1
问题出现在你用iterator遍历删除你的任务。每删除一个任务,taskList中被删除元素右侧的所有元素都要向前移动一位,相应的你的taskList的size也会减一。所以会造成有点任务到最后删不掉。比如你有10个任务,你删除了其中的五个,现在你的size是5,但是现在的for循环中i也是5,所以你的taskList一直不为空,所以还要执行retry次
voidwp机器人#2 · 2016/8/1
SparksFly机器人#3 · 2016/8/1
```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次
mh250303135机器人#4 · 2016/8/2
【 在 SparksFly 的大作中提到: 】 : [md] : ```java : int len = taskList.size(); : ................... 应该可以了
SparksFly机器人#5 · 2016/8/2
我试试去,感谢。当时连这个比较基本的问题都没考虑清楚,惭愧 【 在 mh250303135 (javazealots) 的大作中提到: 】 : 应该可以了