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

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

使用 Futures 并行運行多個調用去生成對象

使用 Futures 并行運行多個調用去生成對象

眼眸繁星 2023-05-10 15:02:20
我必須構建自定義類型對象,并且在返回和填充對象之前有多個調用。我必須使用 Java 8 Future 并行構建對象,以便代碼塊更受歡迎。代碼如下 -public CustomRequest getCustomRequest(Member member,     Address address,Member member){    CustomRequest customRequest = new CustomRequest();    CompletableFuture.runAsync(() -> {        populateAddress(address, customRequest);        populatecontact(contact, customRequest);        populateMemberDetails(member, customRequest);    });    return customRequest;}當前正在獲取“在 customRequest 對象側未設置任何值”(已在 populatecontact、populatecontact 和 populateMemberDetails 中為 customRequest 對象設置了一些值)作為方法調用的返回,確實需要等待 CompletableFuture 或 Futures 本身的使用錯誤。
查看完整描述

1 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

問題是您在自定義請求被填充之前返回了自定義請求,因為您返回的對象仍在另一個線程中填充。customRequest如果您希望在返回對象之前完全填充該對象,則需要通過調用如下CompletableFuture方法來等待完成:CompletableFuture.get()


public CustomRequest getCustomRequest(Member member, 

    Address address,Member member){

    CustomRequest customRequest = new CustomRequest();

    CompletableFuture.runAsync(() -> {

        populateAddress(address, customRequest);

        populatecontact(contact, customRequest);

        populateMemberDetails(member, customRequest);

    }).get();//EDIT: added get method here to wait for the execution

    return customRequest;

}

但是這種使用CompletableFuture實際上沒有多大意義(除了填充是在另一個線程中完成的)。它仍然是一個阻塞調用,您將不得不等待對象被填充。


Future您可以嘗試像這樣使用 java 8框架:


public CompletableFuture<CustomRequest> getCustomRequest(Member member, Address address, Member member){

    return CompletableFuture.supplyAsync(() -> {

        CustomRequest customRequest = new CustomRequest();

        populateAddress(address, customRequest);

        populatecontact(contact, customRequest);

        populateMemberDetails(member, customRequest);

        return customRequest;

    });

}

這樣你就可以像這樣創建方法調用(只是一個例子):


getCustomRequest(aMember, anAddress, anotherMember).thenAccept(populatedCustomRequest -> populatedCustomRequest.doSomethingUsefull());

使用例如類的方法thenAccept(Consumer)CompletableFuture。doSomethingUsefull()這將導致類的方法在填充后立即CustomRequest在完整的填充對象上執行。CustomRequest


查看完整回答
反對 回復 2023-05-10
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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