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