繁体   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