Supponiamo di avere un thread che consuma oggetti prodotti da un altro thread. Il suo metodo di esecuzione è il seguente, con INQUEUE essendo un BlockingQueueIn quali condizioni BlockingQueue.take genera un'eccezione interrotta?
boolean shutdown = false;
while (!shutdown) {
try {
WorkItem w = inQueue.take();
w.consume();
} catch (InterruptedException e) {
shutdown = true;
}
}
Inoltre, un thread diverso segnalerà che non ci sono altri elementi di lavoro di interrompere il filo conduttore.() Genera un'eccezione interrotta se non ha bisogno di bloccare per recuperare il successivo oggetto di lavoro. Ad esempio, se il produttore segnala di aver completato la coda di lavoro, è possibile lasciare accidentalmente alcuni elementi in InQueue o saltare l'interruzione?
Hai quasi capito bene. Anziché avere il * consumer * impostato su "shutdown" su true al momento dell'interruzione, invece il * producer * lo imposta su true prima di interrompere l'utente. Nota questo A) mantiene le cose belle evitando un valore sentinella ("poison pill"), B) gestisce correttamente wakeups spuri, e C) è più generale in quanto puoi deliberatamente fermare il consumatore indipendentemente dal fatto che la coda sia vuota. – user359996