2011-02-08 7 views
8

Bazı kodları, tek bir engelleme yönteminde, çok sayıda yavaş üçüncü taraf hizmetini senkronize olmayan şekilde çağıran bir kod yazıyoruz. Bu uyumsuz aramalar, aynı arabirim yöntemini uygulayan kodda bulunur. Zaman uyumsuz çağrıları iptal etmek ve engelleme yöntem çağrısı geri dönmeden önce hepsi geri gelene kadar beklemek istiyoruz.Bir grup eşzamansız Java çağrısını beklemenin hafif yolu

Umarım bu açıktır!

Bunu uygulamak için uygun bir desen/kütüphane var mı ... oldukça yaygın bir model olmalı. Şimdiden teşekkürler.

cevap

9

Zaman uyumsuz çağrı sayısıyla başlatılan ve her bir eşitleme eylemcisinin mandalı azaltan bir CountDownLatch kullanabilirsiniz. sadece tam sayım için "bekliyor" olur "dış" engelleme yöntemi, örneğin:

// Untested, Java pseudocode... 
public void awaitAllRemoteCalls() { 
    final CountDownLatch allDoneSignal = new CountDownLatch(N); 
    // For each remote N calls... 
    thirdPartyAsyncCall.call(new AsyncHandler(Object remoteData) { 
     // Handle the remote data... 
     allDoneSignal.countDown(); 
    }); 
    allDoneSignal.await(); 
} 
2

Bir şeyler yapıyoruz emin değilim ama tercihen tarafından (zaman uyumsuz görevleri başlar ne olurdu Bir Executor kullanarak), başlattığınız her görev için bir Future<?> döndürün. Burada get() için taşıma istisna dışında bıraktım

List<Future<?>> futures = startAsyncTasks(); 
for (Future<?> future : futures) { 
    future.get(); 
} 
// all async tasks are finished 

, ama bu genel bir fikir: O zaman sadece bunu get() arayarak aracılığıyla Collection tüm Future<?> s koymak ve yineleme gerekiyordu.