执行程序任务的效果在invokeAll后可见?

如果我使用invokeAll将某些任务提交给Executor ,那么我保证提交的线程能够看到任务执行的所有副作用,即使我没有在每个返回的Future上调用get()

从实际的角度来看,这似乎是一个有用的保证,但我没有看到javadoc中的任何东西。

更确切地说,在从invokeAll()调用返回之前, Callable正文中提交给执行器的所有操作都会发生吗?

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


如果invokeAny()承诺在invokeAny()返回时没有任何任务仍在执行中,则会出现这种情况:所有副作用都是可见的。

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

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


从ExecutorService的文档:

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

当我读到这个时,在提交任务时存在内存障碍,所以可能需要在列表中的最后一个任务上调用get() ,而不是其他任务。

但是,由于调用get()是确定任务是完成还是抛出的唯一方法,因此无论内存保证如何,我都会在每个Future调用它。

链接地址: http://www.djcxy.com/p/8847.html

上一篇: effects of executor tasks visible after invokeAll?

下一篇: Java: when to use static methods