アプローチは、セット内のデータと操作の正常な完了との関係によって異なります。
セットからの削除は、タスク実行の結果とは無関係です
スレッド実行の実際の結果を気にしない場合は、セットを調べて、タスクをディスパッチするときにすべてのアイテムを削除できます (すでにいくつかの例があります)。
タスクの実行が正常に完了した場合にのみセットから削除
セットからの削除が実行の成功に対するトランザクションである必要がある場合は、Future
s を使用して、タスク実行の成功に関する情報を収集できます。そうすれば、正常に実行されたアイテムのみが元のセットから削除されます。Future
s と anを使用して実行をチェックから分離できるため、Set 構造に同時にアクセスする必要はありません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
}
}