当前位置: 首页 > 知识库问答 >
问题:

接口上的Java CompletableFuture链调用

段干河
2023-03-14

我有一些工作流抽象依赖于接口WorkflowStep:

public interface WorkflowStep {

    public void executeStep();
}

现在我有三个不同的类来实现这个接口:

GetCoordinatesForWaypoints, DisplayDetails, PlaySounds
public class GetCoordinatesForEndpoints implements WorkflowStep {
    @Override
    public void executeStep() {
        new Thread(new Runnable() {
            @Override
            public void run() {
              //download coordinates from open street map
        }).start();

    }
}
public class DetailsDispatchWorkflow implements DispatchWorkflow {
    private List<WorkflowStep> workflowSteps;

    public DetailsDispatchWorkflow() {
        workflowSteps = new LinkedList<>();
    }

    @Override
    public void start() {
        workflowSteps.add(new GetCoordinatesForEndpoints());
        workflowSteps.add(new DisplayDetails());
        workflowSteps.add(new PlaySounds());
        workflowSteps.forEach(WorkflowStep::executeStep);
    }
}
ExecutorService executorService = Executors.newFixedThreadPool(5);
CompletableFuture<WorkflowStep> workflowStepCompletableFuture = 
CompletableFuture.supplyAsync(() -> new 
GetCoordinatesForEndpoints().executeStep(), executorService);
.thenAccept(() -> new DisplayDetails().executeStep(), executorService);

我得到一个错误,编译器不能推断函数接口类型。我的问题是:如何实现以下调用链:

CompletableFuture<WorkflowStep> workflowStepCompletableFuture = 
    CompletableFuture
        .supplyAsync(() -> new GetCoordinatesForEndpoints().executeStep(), executorService)
        .thenAccept(() -> new DisplayDetails().executeStep(), executorService)
        .thenAcceptAsync(() -> new PlaySounds().executeStep(), executorService);

当所有实例化的对象实现相同的接口时?

共有1个答案

朱宏爽
2023-03-14

您的WorkflowStep接口基本上等同于runnable:没有输入,没有输出。因此,在CompletableFutureAPI中,应该使用相应的runasync()thenrunasync()方法:

CompletableFuture<Void> workflowStepCompletableFuture = 
    CompletableFuture
        .runAsync(() -> new GetCoordinatesForEndpoints().executeStep(), executorService)
        .thenRunAsync(() -> new DisplayDetails().executeStep(), executorService)
        .thenRunAsync(() -> new PlaySounds().executeStep(), executorService);

这将使它们都异步运行,但按顺序运行(就像您试图做的那样)。

当然,您还应该从实现中删除线程创建,以使其更加有用。

 类似资料:
  • Q1。我的理解是。但是超时场景呢? Q2。在哪里检查完整未来的默认超时设置?如何更改它?未来超时后会发生什么?(完成还是异常?) Q3。只要未来“完成”(完成或超时或任何最后阶段),我就需要。是否有保证在未来“完成”后调用的方法?我应该把放在哪里? 从新到完整的未来。更喜欢用Java8回答。谢谢你的帮助。

  • 4.2 接口调用 Camel管理端定义了两个版本的接口。第一版接口路径以"/api/"开头,第二版接口路径以"/api/v2"开头。 两个版本接口的主要区别在于:第二版本接口将更改配置、发布配置文件这两部操作聚合成为一个原子操作。则调用第二版本接口,如果成功,则Nginx当前配置为更改之后的配置;如果失败,则Nginx当前配置为调用接口之前的配置。不会出现不安全的中间状态。 第一版本接口: 更新节

  • 我在架构“ID”中的链接服务器(宿主服务器)上有一个名为“Application”的表。我正在尝试使用< code>sp_help查看相同的详细信息。 但我做不到。问题是:1.sp_help位于schema中。(很明显!)2.但我的表位于另一个名为的模式中。(例如,从ID.Application中选择*) > 我已经将链接服务器添加到我的本地sql server management studio

  • 一般在开始使用tendermint之前, 作为开发者应该最关心的就是abci接口了, 因为这个是和tendermint进行交互的关键。 个人觉得这个也是tendermint的优势之一。 有了这个接口定义才有了实现通用区块链平台的可能。 所以说如果作为一个开发者, 不想了解整个tendermint的流转流程, 只想实现自己特定功能的区块链, 那么这一篇文章至少是应该看得。 我会从客户端创建开始说起,

  • 下面是我试图做的一个非常简单的说明: 最后一个方法调用(consumer.consumer())给了我一个编译器错误 Out projected type’EventConsumer 我知道Kotlin对泛型的要求比Java严格得多,这可能就是它不起作用的原因,但我该如何正确地实现这样的东西呢?

  • jd.setEnableDebug(OBJECT) 设置是否打开调试开关,此开关对正式版也能生效。 OBJECT 参数说明: 参数名 类型 必填 说明 enableDebug Boolean 是 是否打开调试 success Function 否 接口调用成功的回调函数 fail Function 否 接口调用失败的回调函数 complete Function 否 接口调用结束的回调函数(调用成功