gpt4 book ai didi

java - 在 CompletableFuture 中使用 Supplier 会产生与使用 lambda 不同的结果

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:40:16 26 4
gpt4 key购买 nike

我创建了一个读取文本文件并使用 CompletableFuture 包装调用的小示例。

public class Async {
public static void main(String[] args) throws Exception {
CompletableFuture<String> result = ReadFileUsingLambda(Paths.get("path/to/file"));
result.whenComplete((ok, ex) -> {
if (ex == null) {
System.out.println(ok);
} else {
ex.printStackTrace();
}
});
}

public static CompletableFuture<String> ReadFileUsingSupplier(Path file) throws Exception {
return CompletableFuture.supplyAsync(new Supplier<String>() {
@Override
public String get() {
try {
return new String(Files.readAllBytes(file));
} catch (IOException e) {
e.printStackTrace();
return "test";
}
}
}, ForkJoinPool.commonPool());
}

public static CompletableFuture<String> ReadFileUsingLambda(Path file) throws Exception {
return CompletableFuture.supplyAsync(() -> {
try {
return new String(Files.readAllBytes(file));
} catch (IOException e) {
e.printStackTrace();
return "test";
}
} , ForkJoinPool.commonPool());
}
}

此代码不返回任何内容。它执行并且“没有任何反应”,没有错误或输出。如果我调用 ReadFileUsingSupplier 而不是 ReadFileUsingLambda,那么我会在控制台中打印文件内容!

对我来说这没有意义,因为 lambda 是编写内联函数的简写,它不应该改变行为,但在这个例子中它显然改变了。

最佳答案

我认为这只是执行时间的问题 - lambda 可能需要更多时间才能执行,从而允许程序在您完成读取文件之前退出。

试试这个:

  • 添加 Thread.sleep(1000); 作为 ReadFileUsingSupplier 中 try block 中的第一条语句,您将看不到任何输出
  • 在使用 ReadFileUsingLambda 时在 main 的末尾添加一个 Thread.sleep(1000);,您将看到预期的输出

为确保您的 main 不会在 future 完成之前退出,您可以调用:

result.join();

关于java - 在 CompletableFuture 中使用 Supplier 会产生与使用 lambda 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41343339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com