He encontrado un problema dos veces ahora por el cual una hebra de productor produce N elementos de trabajo, los envía a un ExecutorService
y luego necesita esperar hasta que se hayan procesado todos los N elementos.Conteo flexibleDownLatch?
Advertencias
- N no se conoce de antemano. Si fuera así, simplemente crearía un
CountDownLatch
y luego tendré el hilo productorawait()
hasta que se complete todo el trabajo. - utilizando un
CompletionService
es inadecuado porque aunque mi hilo productor necesita para bloquear (es decir, llamandotake()
) hay hay manera de señalar que todo el trabajo se haya completado, para hacer que el hilo productor que dejar de esperar.
Mi solución preferida actual es utilizar un contador de números enteros, y para incremento esto cada vez que se presenta un elemento de trabajo y al decremento cuando se procesa un elemento de trabajo. Después de la presentación de todas las N tareas, mi secuencia de producción deberá esperar en un bloqueo, verificando si counter == 0
siempre que se notifique. El/los hilo (s) de consumo deberán notificar al productor si ha decrementado el contador y el nuevo valor es 0.
¿Hay un mejor enfoque para este problema o hay una construcción adecuada en java.util.concurrent
? que "rodar el mío"?
Gracias de antemano.
¿En qué momento el productor sabe cuántos elementos de trabajo hay? Cuando el último artículo ha sido producido? –
Su solución actual puede sufrir una condición de carrera: producir elemento 1 -> contador ++ -> procesar elemento 1 -> contador-- -> producir elemento 2. Como el contador se ha decrementado antes de que el productor haya producido el siguiente artículo, el productor piensa que está listo. –
@rwwilden: Tiene razón en que este escenario podría ocurrir. Sin embargo, mi productor solo inspeccionaría/esperaría en el mostrador después de enviar * todos los elementos de trabajo, por lo que no representa una condición de carrera en este caso particular. – Adamski