Se si utilizza il seguente "idioma" con interruzione in Java, ad esempio from this answer.È possibile un controllo di interruzione "atomico" in java?
while (!Thread.currentThread().isInterrupted()) {
try {
Object value = queue.take();
handle(value);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
Dove take è un'operazione di blocco, può un interrupt non essere ignorato per il momento, se un interrupt "arriva" tra il controllo della Thread.currentThread().isInterrupted()
e la chiamata queue.take()
? Non si tratta di un'operazione "check-than-act"? In tal caso, può essere in qualche modo garantito che il ciclo sia lasciato in ogni caso se il thread è interrotto?
È possibile utilizzare poll with a timeout in modo che il ciclo venga lasciato dopo il timeout, ma è possibile controllare lo stato interrotto e agire su di esso atomicamente?
Come potrebbe mai essere interrotto un interrupt dal codice sopra riportato? Ti rendi conto che queue.take() verrà lanciato immediatamente se il thread viene interrotto prima che la chiamata prenda(), giusto? –
@JBNizet: Ho controllato il codice, e hai ragione, i metodi che lanciano il controllo 'InterruptedException' per lo stato interrotto e il lancio. Se aggiungi una risposta, la accetterò. – user140547