Una cola de bloqueo (de Joonas Pulakka) es la respuesta pesada. Una respuesta más simple podría funcionar. Si tiene todos los datos almacenados en la fuente, simplemente puede pasar una referencia al procesador, y puede obtener los datos de la fuente. Por supuesto, esto es probablemente lo que estabas haciendo en el pasado. Es posible que no tenga todos los datos en la memoria en la fuente y que no obtenga el bajo acoplamiento que desea.
El siguiente paso sería utilizar una interfaz Enumerator o Iterator. (Los iteradores son más comunes en Java, aunque la mayoría de las veces ese remove
método es solo una molestia). El procesador obtendría el iterador de la fuente y luego llamaría a los métodos hasta que esté listo. Si la fuente extrae datos de terrabytes de alguna parte, cada llamada puede demorar un poco. Pero si va a dormir el procesador hasta que haya algo en la cola de todos modos, esto lo hará automáticamente. Y si la fuente se adelanta al productor, la fuente esperará automáticamente a que el productor llame hasNext
y next
.
Si, por otro lado, desea que la fuente tome datos de su fuente lo más rápido posible y los acumule hasta que el procesador se ponga al día, sin esperar a que el procesador procese, entonces la cola, y múltiples hilos, comienza a parecer una buena idea, aunque más complicada. Ahora, la fuente se acumulan los datos cuando se puede correr más rápido (el límite es de suponer algo así como disco I / O), y el procesador puede reducir el tamaño de la pila cuando se puede correr más rápido, (su límite es la rapidez con la persistencia módulo puede persistir los datos).