Supongamos que tengo un hilo que consume elementos producidos por otro hilo. Su método de ejecución es el siguiente, con INQUEUE ser un BlockingQueue¿En qué condiciones lanzará BlockingQueue.take una excepción interrumpida?
boolean shutdown = false;
while (!shutdown) {
try {
WorkItem w = inQueue.take();
w.consume();
} catch (InterruptedException e) {
shutdown = true;
}
}
Por otra parte, un hilo diferente, señal de que no hay más elementos de trabajo por la interrupción de este hilo conductor. Will take() arroja una excepción interrumpida si no necesita bloquear para recuperar el siguiente elemento de trabajo. es decir, si el productor indica que se ha completado el llenado de la cola de trabajo, ¿es posible dejar accidentalmente algunos elementos en inQueue o perder la interrupción?
Casi lo has acertado. En lugar de hacer que * consumer * establezca "shutdown" en true en caso de interrupción, en su lugar, el * producer * debe establecerlo en true antes de interrumpir al consumidor. Tenga en cuenta que A) mantiene las cosas bonitas al evitar un valor centinela ("píldora venenosa"), B) maneja correctamente los despertadores espurios, y C) es más general en que puede detener deliberadamente al consumidor ya sea que la cola esté vacía o no. – user359996