将变量传递给ExecutorService的Future

时间:2016-01-09 07:50:14

标签: java concurrency

我想重构以下代码

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`

1 个答案:

答案 0 :(得分:1)

您唯一需要担心的是对此allString集合的并发访问。

因此,根据此线程中的内容(MyTask),您应该选择Set的适当同步实现;哪一个,你可以在这里阅读:Different types of thread-safe Sets in Java