3

如果我将一些任务提交给Executorusing invokeAll,我是否保证提交的线程会看到任务执行的所有副作用,即使我没有调用get()每个返回Future的 s?

从实际的角度来看,这似乎是一个有用的保证,但我在 javadoc 中看不到任何内容。

更准确地说,Callable提交给执行程序的主体中的所有操作是否都发生在调用返回之前invokeAll()

无用地调用get()每个未来是很烦人的,而实际上返回类型是Void并且没有抛出异常——所有的工作都是作为副作用发生的。

4

2 回答 2

2

ExecutorService的文档中:

在将 Runnable 或 Callable 任务提交到 ExecutorService 之前线程中的操作发生在该任务采取的任何操作之前,这反过来又发生在通过 Future.get() 检索结果之前。

在我阅读本文时,任务提交存在内存障碍,因此您可能需要调用get()列表中的最后一个任务,而不是其他任务。

但是,由于调用get()是确定任务是完成还是抛出的唯一方法,所以我仍然会在 every 上调用它Future,而不考虑内存保证。

于 2011-09-14T11:45:27.510 回答
1

如果invokeAny()承诺返回时没有任务仍在执行invokeAny(),情况就是这样:所有副作用都是可见的。

为了invokeAny()知道所有任务都已完成,它需要与那些线程同步,这意味着函数的返回发生在任务完成之后(以及任务中发生的所有事情)。然而 'ExecutorServe' 和 'Future.cancel()' 的 API 并没有明确说明当你取消一个正在运行的任务时会发生什么(特别是:将cancel()等待返回,直到任务停止运行。事实上,在调用之后cancel()isDone()必须返回true,确实意味着cancel()在任务实际完成执行之前不会返回。

invokeAny() 另一件需要注意的事情是,在不检查Future对象的情况下使用时,您将不知道任务是否开始执行。

于 2011-09-14T08:25:28.173 回答