我想重构以下代码
Set<String> allStrings ...
Set<MyTask> myTasks = ...
myTasks.add(new MyTask());
myTasks.add(new MyTask());
...
List<Future<Set<String>>> futures = executorService.invokeAll(myTasks);
executorService.shutdown();
for (Future<Set<String>> future : futures) {
Set<String> strings = future.get();
allStrings.addAll(strings);
}
// do stuff with allStrings
....
这样allStrings
传递给MyTask
,其中变量填充在类中,Future返回Void
:
Set<String> allStrings ...
Set<MyTask> myTasks = ...
myTasks.add(new MyTask(allStrings));
myTasks.add(new MyTask(allStrings));
...
executorService.invokeAll(myTasks);
executorService.shutdown();
// do stuff with allStrings
....
这样可以吗?是否有任何并发性的事情我不得不担心,因为结果似乎不同(在我的实际代码中 - 而不是这段代码)?
另外,我可以假设所有任务都已完成,以便在使用allStrings
进行操作之前不需要进行虚拟循环:
for (Future<Set<String>> future : futures) {
future.get();
}
// do stuff with `allStrings`
答案 0 :(得分:1)
您唯一需要担心的是对此allString
集合的并发访问。
因此,根据此线程中的内容(MyTask
),您应该选择Set
的适当同步实现;哪一个,你可以在这里阅读:Different types of thread-safe Sets in Java