为了账号安全,请及时绑定邮箱和手机立即绑定

Java CompletableFuture 链调用接口

Java CompletableFuture 链调用接口

素胚勾勒不出你 2023-07-13 17:45:04
我有一些依赖于接口的工作流程抽象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);当所有实例化对象都实现相同的接口时?
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

你的WorkflowStep界面基本上相当于Runnable:没有输入,没有输出。在CompletableFutureAPI 中,您应该使用相应的runAsync()thenRunAsync()方法:

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

这将使它们全部异步运行,但按顺序运行(就像您正在尝试做的那样)。

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


查看完整回答
反对 回复 2023-07-13
  • 1 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信