亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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();    }}其他類的方法看起來類似?,F在我有一個開始工作流程的中心類。目前它看起來像這樣: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 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號