首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Playframework示例项目中的AsyncController

理解Playframework示例项目中的AsyncController
EN

Stack Overflow用户
提问于 2018-03-22 12:54:19
回答 1查看 74关注 0票数 1

我正在研究Playframework的概念,我坚持使用的是AsyncController示例,它说明了以下描述:

此控制器包含一个操作,演示如何在控制器中编写简单的异步代码。使用计时器异步延迟发送响应1秒。

我在这里用粗体标记有问题的语句。

这里是控制器的代码,在这里,我删除了方法的描述,以避免在问题页面上浪费空间。

代码语言:javascript
复制
@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()方法的同一个线程中执行,因此不能认为它是异步的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-22 15:18:38

不涉及Akka或Play的细节,异步延迟的一般想法是它不会阻塞线程,因此可以同时执行其他一些操作。当您调用.thenApplyAsync时,您将设置一个回调,该回调将在将来的结果准备就绪时执行。所以调度程序知道该做什么:计划在1秒内运行未来(如果它同时有其他事情要做,请执行它),一旦将来准备好了,就运行回调。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49429252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档