CompletableFuture的obtrudeValue()方法如何工作?

时间:2018-11-25 14:34:08

标签: java multithreading

根据oracle docs obtrudeValue(T value)方法“强制设置或重置随后由get()方法和相关方法返回的值,无论是否已完成。该方法仅设计用于错误恢复操作,并且即使在这种情况下,使用既定结果还是改写结果也可能导致进行中的依存完成。”

参考: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#obtrudeValue-T-

我在Google上搜索了很多,但不知道此obtrudeValue方法会导致什么问题。 谁能帮助我理解以下内容:

  • 使用obtrudeValue方法安全吗?
  • 如果obtrudeValue不安全使用,那么可以使用哪种CompletableFuture方法读取异步值?
  • 在哪种情况下obtrudeValue方法会导致问题?

非常感谢您。

1 个答案:

答案 0 :(得分:1)

ObtrudeValue 只需设置/覆盖 CompletableFuture 的结果(无论将来是否完成都无所谓)。

您不应使用此方法设置 CompletableFuture 的结果。

在大多数情况下,您应该使用方法 complete 或方法 completeExceptionally 。 这些方法很安全,可以确保仅在将来未完成且后续调用无法更改结果时才设置结果,因此,当您调用get()方法时,始终会得到由这些方法设置的第一个结果方法。

您总是可以通过调用 get 方法从CompletableFuture中获取异步值。

仅在非常特殊的情况下才应使用ObtrudeValue,当您想从某种不正确的状态中恢复时,则可以重置/覆盖以前的值。

示例:

CompletableFuture<String> fut = new CompletableFuture<>();
    fut.complete("test1");
    System.out.println(fut.get()); // test1
    fut.complete("test2");
    System.out.println(fut.get()); // test1 , value ont overwritten

    fut.obtrudeValue("obtrudeValue");
    System.out.println(fut.get()); // obtrudeValue , overwrite the value even of completed future
    fut.obtrudeValue("newObtrudeValue");
    System.out.println(fut.get()); // newObtrudeValue , subsequent call overwrite the value

    fut.complete("test3");
    System.out.println(fut.get()); // newObtrudeValue , value not overwritten by calling complete