根据oracle docs obtrudeValue(T value)方法“强制设置或重置随后由get()方法和相关方法返回的值,无论是否已完成。该方法仅设计用于错误恢复操作,并且即使在这种情况下,使用既定结果还是改写结果也可能导致进行中的依存完成。”
我在Google上搜索了很多,但不知道此obtrudeValue方法会导致什么问题。 谁能帮助我理解以下内容:
非常感谢您。
答案 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