我有一些依赖于接口的工作流程抽象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);
当所有实例化对象都实现相同的接口时?
翻阅古今
相关分类