猿问

Java CompletableFuture 链调用接口

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


public interface WorkflowStep {


    public void executeStep();

}

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


GetCoordinatesForWaypoints, DisplayDetails, PlaySounds

我的目标是将它们与 链接起来CompletableFuture,目前每个重写executeStep()方法都在可运行的环境中运行,如下所示:


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);

    }

}

现在我想用CompletableFutures 替换它。我尝试的第一件事是做这样的事情:


ExecutorService executorService = Executors.newFixedThreadPool(5);

CompletableFuture<WorkflowStep> workflowStepCompletableFuture = 

CompletableFuture.supplyAsync(() -> new 

GetCoordinatesForEndpoints().executeStep(), executorService);

这给了我一个错误(我认为是因为被调用的方法返回 void)。仅调用构造函数即可。我的下一步是将这些调用链接起来thenAccept(因为被调用的操作不返回值),但是当我追加时,这也不起作用


.thenAccept(() -> new DisplayDetails().executeStep(), executorService);

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


CompletableFuture<WorkflowStep> workflowStepCompletableFuture = 

    CompletableFuture

        .supplyAsync(() -> new GetCoordinatesForEndpoints().executeStep(), executorService)

        .thenAccept(() -> new DisplayDetails().executeStep(), executorService)

        .thenAcceptAsync(() -> new PlaySounds().executeStep(), executorService);

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


素胚勾勒不出你
浏览 108回答 1
1回答

翻阅古今

你的WorkflowStep界面基本上相当于Runnable:没有输入,没有输出。在CompletableFutureAPI 中,您应该使用相应的runAsync()和thenRunAsync()方法:CompletableFuture<Void>&nbsp;workflowStepCompletableFuture&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;CompletableFuture &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.runAsync(()&nbsp;->&nbsp;new&nbsp;GetCoordinatesForEndpoints().executeStep(),&nbsp;executorService) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.thenRunAsync(()&nbsp;->&nbsp;new&nbsp;DisplayDetails().executeStep(),&nbsp;executorService) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.thenRunAsync(()&nbsp;->&nbsp;new&nbsp;PlaySounds().executeStep(),&nbsp;executorService);这将使它们全部异步运行,但按顺序运行(就像您正在尝试做的那样)。当然,您还应该Thread从实现中删除创建以使其有用。
随时随地看视频慕课网APP

相关分类

Java
我要回答