簡體   English   中英

Java - 處理非阻塞調用

[英]Java - Handling Non-Blocking Calls

在我的應用程序中,我使用的是第三方API。 這是一種立即返回的非阻塞方法。 我有一個元素集合,我必須調用此方法。

現在,我的問題是我必須找到一種方法,直到所有方法執行完成並進行下一步操作。 我怎么處理這個? 我無法修改第三方API。

簡而言之,它看起來像這樣

for(Object object: objects){
 methodA(object); //this is a non-blocking call and returns immediately
}
// here I want to do my next task only after all the methodA calls completed execution

您要求的是不可能的......除非第三方API 包含一些方法,允許您等到對methodA一個或多個調用完成。

可以?

編輯

凱西斯通指出,另一種可能是空氣污染指數可能有一個回調機制,從而線程(API后面)是做在開始工作methodA調用“回調”到你的代碼。 (API中需要一些其他方法允許您注冊回調對象。)

還有其他可能性......(有些太可怕了)......但它們都需要API 設計為支持與methodA啟動的任務結束同步。

斯蒂芬指出,如果你有辦法知道該方法已經完成,那么這是可能的。 如果您有某種回調或監聽器,您可以使用類似計數信號量的東西:

final Semaphore block = new Semaphore();

//HERE SOMETHING APPROPRIATE TO YOUR API
myAPI.registerListener(new APIListener(){
  public void methodADone(){
    block.release();
  }
});

int permits = 0;
for(Object object: objects){
 methodA(object); //this is a non-blocking call and returns immediately
 permits++;
}
block.acquire(permits);

當然,您需要額外檢查以確保您正在為正確的對象集合發布許可,具體取決於代碼的線程化以及API提供哪些機制來了解調用已完成,但這是一種可以使用的方法。

你如何確定方法A methodA()調用已完成?

該方法是否返回任何句柄? 或者該對象是否有通過methodA()調用設置的任何屬性? 因此,在睡眠時收集它們並檢查所有剩余的句柄或對象屬性,如果已完成,則從剩余的句柄或對象屬性中刪除。

等待代碼看起來像:

while(!remaining.isEmpty()) {
  try {
    Thread.sleep(100);
  } catch (InterruptedException e) {
    continue;
  }
  Iterator<HandleOrObjectWithProperty> i = remaining.iterator();
  while (i.hasNext()) {
    HandleOrObjectWithProperty result = i.next();
    if (result.handleHasFinishedOrPropertyIsSet()) {
      i.remove();
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM