在我的应用程序中,我使用的是第三方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
答案 0 :(得分:8)
您要求的内容是不可能的......除非第三方API 还包含一些方法,允许您等到一个或多个methodA
来电完成。
是吗?
编辑
正如Kathy Stone指出的那样,另一种可能性是API可能有一个回调机制,即methodA
调用启动工作的线程(在API之后)“回调”你的代码。 (API中需要一些其他方法允许您注册回调对象。)
还有其他可能性......(有些太可怕了)......但它们都需要API 设计以支持与{{1}开始的任务结束同步}}
答案 1 :(得分:3)
正如斯蒂芬所说,如果你有办法知道方法已经完成,那是可能的。如果你有某种回调或监听器,你可以使用类似计数信号量的东西:
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提供哪些机制来了解调用已完成,但这是一种可能的方法使用。
答案 2 :(得分:0)
你如何确定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();
}
}
}