我有一个实用工具方法(用于单元测试,它发生了)在另一个线程中执行Runnable.它启动线程运行,但不等待线程完成,而是依赖于Future.该方法的调用者应该得到()Future.但这足以确保Runnable完成计算的安全发布吗?
这是方法:
private static FutureCompletableFutureCompletableFuture
在返回的Future上调用Future.get()之后,该方法的调用者可以安全地假设Runnable已经完成执行,并且其结果已经安全发布了吗?
最佳答案
不,你不需要加入().在未来调用get()就足够了.
CompletableFuture接口是Future的子类型.并且javadoc for Future表明:
Memory consistency effects: Actions taken by the asynchronous computation happen-before actions following the corresponding
Future.get()
in another thread.
发生这种情况之前 – 关系足以确保安全发布get()返回的值.
此外,在CompletableFuture完成,异常完成或取消之前,get()调用将不会完成.