2

私のアプリケーションでは、サードパーティの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
4

3 に答える 3

8

要求していることは不可能です...サードパーティのAPIに、1つ以上の呼び出しが完了するまで待機できるメソッドも含まれていない限り。methodA

しますか?

編集

Kathy Stoneが指摘しているように、別の可能性として、APIにコールバックメカニズムがあり、呼び出しによって開始された作業を実行しているスレッド(APIの背後)がmethodAコードに「コールバック」する可能性があります。(APIには、コールバックオブジェクトを登録できる他のメソッドが必要です。)

他の可能性もあります...(言及するにはあまりにも恐ろしいです)...しかし、それらはすべて、によって開始されたタスクの終了との同期をサポートするように設計されmethodAたAPIを必要とします。

于 2010-04-12T12:23:13.213 に答える
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が提供するメカニズムに応じて、正しいオブジェクトコレクションの許可を解放していることを確認するために追加のチェックが必要になりますが、これは使用できるアプローチの1つです。

于 2010-04-12T12:42:19.597 に答える
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();
    }
  }
}
于 2010-04-12T12:48:45.487 に答える