[英]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.