gpt4 book ai didi

java - 将变量传递给 ExecutorService 的 Future

转载 作者:行者123 更新时间:2023-11-30 07:41:06 26 4
gpt4 key购买 nike

我想重构以下代码

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`

最佳答案

这里您唯一应该担心的是对此 allString 集合的并发访问。

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

关于java - 将变量传递给 ExecutorService 的 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34691065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com