如果我使用 invokeAll
将一些任务提交给 Executor
,我是否可以保证提交的线程看到任务执行的所有副作用,即使我不这样做是否对每个返回的 Future
调用 get()
?
从实际的角度来看,这似乎是一个有用的保证,但我在 javadoc 中没有看到任何内容。
更准确地说,在 invokeAll()
返回 happen-before 提交给执行者的 Callable
主体中执行所有操作打电话?
在每个 future 上无用地调用 get()
是很烦人的,而实际上返回类型是 Void
并且没有抛出异常 - 所有的工作都发生在副作用。
最佳答案
来自 ExecutorService 的文档:
Actions in a thread prior to the submission of a Runnable or Callable task to an ExecutorService happen-before any actions taken by that task, which in turn happen-before the result is retrieved via Future.get().
当我阅读本文时,任务提交存在内存障碍,因此可能您需要调用 get()
在你列表中的最后一个任务上,而不是其他任务。
但是,自从调用 get()
是确定任务是完成还是抛出的唯一方法,我仍然会在每个 Future
上调用它,无论内存保证如何。
关于java - 在 invokeAll 之后执行程序任务的所有副作用是否可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7412904/