Java - 处理非阻塞调用

时间:2010-04-12 12:18:46

标签: java nonblocking control-flow

在我的应用程序中,我使用的是第三方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

3 个答案:

答案 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();
    }
  }
}