Tengo varios trabajadores que usan ArrayBlockingQueue.Java: Producer = Consumer, ¿cómo saber cuándo parar?
Cada trabajador toma un objeto de la cola, lo procesa y, como resultado, puede obtener varios objetos, que se colocarán en cola para su posterior procesamiento. Entonces, trabajador = productor + consumidor.
Trabajador:
public class Worker implements Runnable
{
private BlockingQueue<String> processQueue = null;
public Worker(BlockingQueue<String> processQueue)
{
this.processQueue = processQueue;
}
public void run()
{
try
{
do
{
String item = this.processQueue.take();
ArrayList<String> resultItems = this.processItem(item);
for(String resultItem : resultItems)
{
this.processQueue.put(resultItem);
}
}
while(true);
}
catch(Exception)
{
...
}
}
private ArrayList<String> processItem(String item) throws Exception
{
...
}
}
principal:
public class Test
{
public static void main(String[] args) throws Exception
{
new Test().run();
}
private void run() throws Exception
{
BlockingQueue<String> processQueue = new ArrayBlockingQueue<>(10000);
processQueue.put("lalala");
Executor service = Executors.newFixedThreadPool(100);
for(int i=0; i<100; ++i)
{
service.execute(new Worker(processQueue));
}
}
}
¿Cuál es la mejor manera de evitar que los trabajadores, cuando no hay más trabajo es?
En primer lugar, lo que tengo en mente, es comprobar periódicamente cuántos elementos en cola y cuántos elementos están actualmente en proceso. Si ambos son iguales a cero, haga algo como "shutdownNow()" en ExecutorService. Pero no estoy seguro de que esta sea la mejor manera.
La pregunta más interesante es cuál será su protección contra los patrones cíclicos, obviamente la cola puede reproducirse en algunas circunstancias. – Osw
¿Podría aclarar el caso de uso? ¿Desea que la aplicación se termine sola cuando la cola está vacía o que cuando se realiza una solicitud a la aplicación para que se cierre, lo hará solo después de que la cola esté vacía? – Handerson
@Osw, ¿qué quiere decir con "patrón cíclico" aquí? –