我正在研究Playframework概念,我所坚持的是AsyncController
示例,其中说明了以下描述:
此控制器包含一个演示如何在控制器中编写简单异步代码的操作。 它使用计时器异步延迟发送响应1秒钟。
我在这里用粗体标记有问题的陈述。
这是控制器的代码,我删除了方法的描述,而不是在问题页面上浪费空间。
@Singleton
public class AsyncController extends Controller {
private final ActorSystem actorSystem;
private final ExecutionContextExecutor exec;
@Inject
public AsyncControllerSO(ActorSystem actorSystem, ExecutionContextExecutor exec) {
this.actorSystem = actorSystem;
this.exec = exec;
}
public CompletionStage<Result> message() {
return getFutureMessage(1, TimeUnit.SECONDS).thenApplyAsync(Results::ok, exec);
}
private CompletionStage<String> getFutureMessage(long time, TimeUnit timeUnit) {
CompletableFuture<String> future = new CompletableFuture<>();
actorSystem.scheduler().scheduleOnce(
Duration.create(time, timeUnit),
() -> future.complete("Hi!"),
exec
);
return future;
}
}
我不明白为什么在PlayFramework中给出异步直觉的例子强调“异步延迟定时器”功能?
根据description of scheduleOnce方法:
计划Runnable延迟运行一次,即在执行runnable之前必须经过的时间段。
后者是否意味着延迟正在与message()
方法运行的同一个线程中执行,因此不能将其视为异步?
答案 0 :(得分:1)
没有涉及Akka或Play的细节,关于异步延迟的一般想法是它不会阻塞线程,所以其他事情可以同时完成。当您致电.thenApplyAsync
时,您正在设置一个回调,该回调将在未来结果准备就绪时执行。因此,调度程序知道该怎么做:安排在1秒内运行未来(如果还有其他事情需要同时执行),一旦未来准备就绪,运行回调。