CompletableFuture supplyAsyncmethod() 在 Java 中的工作原理

How CompletableFuture supplyAsyncmethod() works in Java

提问人:Rivo 提问时间:11/6/2023 更新时间:11/6/2023 访问量:62

问:

下面是 completableFuture
https://www.baeldung.com/java-completablefuture 中的错误处理示例

CompletableFuture<String> completableFuture  
  =  CompletableFuture.supplyAsync(() -> {
      if (name == null) {
          throw new RuntimeException("Computation error!");
      }
      return "Hello, " + name;
  }).handle((s, t) -> s != null ? s : "Hello, Stranger!");

由于 handle() 方法将 BiFunction 作为参数,我的问题是 supplyAsync 如何将该参数传递给 handle()。我试图查看源代码,但没有找到。

是否可以用一些简单的例子来演示它,当方法用点链接时,函数是如何从一个方法传递到另一个方法的

首先Mehtod(..)。secondMethod(函数);

Java 异步

评论

2赞 Holger 11/6/2023
是否链接方法调用,都是无关紧要的。你可以写。这没有区别。不会传递任何内容,因为该方法不会调用。这与 .CompletableFuture<String> firstFuture = CompletableFuture.supplyAsync(() -> { if (name == null) { throw new RuntimeException("Computation error!"); } return "Hello, " + name; }); CompletableFuture<String> completableFuture = firstFuture.handle((s, t) -> s != null ? s : "Hello, Stranger!");supplyAsynchandlesupplyAsynchandlenew StringBuilder().append(x).append(y)
0赞 Rivo 11/7/2023
谢谢,现在它更清楚了。由于 supplyAsync() 是异步的,在 supplyAsync 执行后会发生什么 - Java 会等到 supplyAsync() 完成,然后才移动到 handle() 或 handle() 时执行,而 supplyAsync() 仍在处理?
1赞 Holger 11/7/2023
不要将方法调用与 lambda 表达式正文的计算混合在一起。这些方法和 与任何其他链式方法调用一样,一个接一个地执行。是异步计算的,即在工作线程中。它的完成可能会触发同一工作线程或不同工作线程中对 的计算。如果上一阶段已经完成,甚至有可能在方法中进行评估。supplyAsynchandleSupplierBiFunctionBiFunctionhandle
1赞 Holger 11/7/2023
请记住,您还可以将代码编写为Supplier<String> supplier = () -> { if (name == null) { throw new RuntimeException("Computation error!"); } return "Hello, " + name; }; BiFunction<? super String, Throwable, ? extends String> biFunction = (s, t) -> s != null ? s : "Hello, Stranger!"; CompletableFuture<String> firstStage = CompletableFuture.supplyAsync(supplier); CompletableFuture<String> completableFuture = firstStage.handle(biFunction);
1赞 Holger 11/8/2023
目前尚不清楚我们必须从哪里开始。你明白下面的例子吗?撇开我们在这里使用函数来创建 ,此示例的工作方式与 Java 1.0 中相同。在幕后使用线程池,但这并不重要。您可以使用与第一个示例相同的方式创建后台线程。Runnable r = () -> System.out.println("hello from " + Thread.currentThread().getName()); new Thread(r).start();RunnableCompletableFutureCompletableFuture.supplyAsync(() -> "Hello", r -> new Thread(r).start()).thenAccept(System.out::println);

答: 暂无答案