gpt4 book ai didi

java - 具有 SupplyAsync 的 CompletableFuture 未按预期工作

转载 作者:行者123 更新时间:2023-12-01 16:14:58 24 4
gpt4 key购买 nike

我正在使用 Java CompletableFuture 做一些实验。这是代码

public class SpringBootAsyncApplication {

public static void main(String[] args) {

CompletableFuture.supplyAsync(() - > {

return MailUtil.getMailInfo();

}).thenAccept(content - > {
System.out.println("Mail content: " + content);
});
}

}

class MailUtil {
public static String getMailInfo() {
return "Your email content";
}

public static boolean sendMail() {
System.out.println("Send mail: completed");
return true;
}

public static void logging() {
System.out.println("Log: Send mail at " + System.currentTimeMillis());
}
}

我运行该程序 3 次。他们都没有返回任何输出?但是当我替换return MailUtil.getMailInfo();时数字 5

CompletableFuture.supplyAsync(() - > {

return 5;

}).thenAccept(content - > {
System.out.println("Mail content: " + content);
});

然后就可以正常运行了。这是为什么?

最佳答案

你看到的结果只是一个巧合。主线程在异步任务执行/完成之前退出。添加CompletableFuture::join最后你总会看到结果:

CompletableFuture.supplyAsync(() - > {

return MailUtil.getMailInfo();

}).thenAccept(content - > {
System.out.println("Mail content: " + content);
}).join();

这是因为当您使用 supplyAsync 时,您的任务将在来自 ForkJoinPool.commonPool 的线程之一中执行,并且默认情况下该池中的线程是守护线程,因此它们不要阻止 JVM 退出。您可以通过检查与commonPool关联的默认线程工厂来验证这一点:

ForkJoinPool forkJoinPool = ForkJoinPool.commonPool();
ForkJoinWorkerThread forkJoinWorkerThread = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(forkJoinPool);

boolean daemon = forkJoinWorkerThread.isDaemon();
System.out.println(daemon);

输出为true

关于java - 具有 SupplyAsync 的 CompletableFuture 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62425136/

24 4 0