我正在研究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中给出异步直觉的例子强调“定时器到异步延迟”特性?
根据scheduleOnce描述方法:
调度一个可运行的运行时间,以延迟运行一次,即在执行之前必须经过的一个时间段。
后者不意味着延迟在运行message()方法的同一个线程中执行,因此不能认为它是异步的吗?
发布于 2018-03-22 15:18:38
不涉及Akka或Play的细节,异步延迟的一般想法是它不会阻塞线程,因此可以同时执行其他一些操作。当您调用.thenApplyAsync时,您将设置一个回调,该回调将在将来的结果准备就绪时执行。所以调度程序知道该做什么:计划在1秒内运行未来(如果它同时有其他事情要做,请执行它),一旦将来准备好了,就运行回调。
https://stackoverflow.com/questions/49429252
复制相似问题