2011-02-08 22 views
8

Estamos escribiendo código, en un único método de bloqueo, que llama a servicios múltiples y lentos de terceros de forma asincrónica. Estas llamadas asincrónicas están envueltas en código que implementan el mismo método de interfaz. Queremos despedir las llamadas asíncronas y esperar hasta que todas hayan regresado antes de devolver nuestra llamada al método de bloqueo.Modo liviano de esperar un grupo de llamadas Java asíncronas

¡Espero que esté claro!

¿Existe un patrón/biblioteca de diseño adecuado para implementar esto ... debe ser un patrón bastante común. Gracias por adelantado.

Respuesta

9

Puede utilizar un CountDownLatch inicializado con el número de llamadas asincrónicas y hacer que cada controlador asincrónico disminuya el enganche. El método "externa" bloqueo sería simplemente "espera" para la cuenta atrás completa, por ejemplo:

// 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

no estoy seguro de cómo lo está haciendo cosas, pero me gustaría tener lo que inicia las tareas asíncronas (preferiblemente usando un Executor) devuelva un Future<?> para cada tarea que comience. Entonces será sólo hay que poner todos los Future<?> s en un Collection e iterar a través de él llamando get():

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

He dejado de lado el manejo de get() aquí una excepción, pero esa es la idea general.

Cuestiones relacionadas