该方法取决于您集合中的数据与操作的成功完成之间的关系。
Remove from Set 独立于任务执行的结果
如果您不关心线程执行的实际结果,则可以在分派任务时遍历集合并删除每个项目(您已经有一些示例)
仅当任务执行成功完成时从 Set 中移除
如果从集合中删除对执行成功是事务性的,则可以使用Future
s 收集有关任务执行成功的信息。这样,只有成功执行的项目才会从原始集合中删除。无需同时访问 Set 结构,因为您可以使用Future
s 和 an将执行与检查分开ExecutorService
。例如:
// This task will execute the job and,
// if successful, return the string used as context
class Task implements Callable<String> {
final String target;
Task(String s) {
this.target = s;
}
@Override
public String call() throws Exception {
// do your stuff
// throw an exception if failed
return target;
}
}
这就是它的使用方式:
ExecutorService executor;
Set<Callable<String>> myTasks = new HashSet<Callable<String>>();
for(String s: set) {
myTasks.add(new Task(s));
}
List<Future<String>> results = executor.invoqueAll(myTasks);
for (Future<String> result:results) {
try {
set.remove(result.get());
} catch (ExecutionException ee) {
// the task failed during execution - handle as required
} catch (CancellationException ce) {
// the task was cancelled - handle as required
}
}