Parte del problema è stato che non conosco tutti i metodi richiamati che cancellano il flag di interrupt.
E 'importante chiarire che i seguenti metodi di cancellare il flag di interrupt semplicemente chiamandoli:
Thread.interrupted()
Thread.isInterrupted(true) -- added to your list
Per questo motivo Thread.currentThread().isInterrupted()
dovrebbe essere sempre usato al posto.
I seguenti metodi saranno cancellare il flag interrotto da immediatamente gettando InterruptedException
o se sono stati chiamati e poi il filo è stato interrotto o se il filo è stato già interrotto e poi sono stati chiamati (vedi codice JUnit sotto). Quindi non è il metodo che cancella la bandiera, l'eccezione fa.
Thread.sleep(long)
Thread.join()
Thread.join(long)
Thread.join(int, long) – added to your list
Object.wait()
Object.wait(long)
Object.wait(int, long) – added to your list
BlockingQueue.put(...) – added to your list
BlockingQueue.offer(...) – added to your list
BlockingQueue.take(...) – added to your list
BlockingQueue.poll(...) – added to your list
Future.get(...) – added to your list
Si noti che il modello corretta con qualsiasi codice che cattura InterruptedException
è da ripristinare immediatamente interrompere il filo. Facciamo questo nel caso in cui gli altri si affidano al metodo thread.isInterrupted()
:
try {
...
} catch (InterruptedException e) {
// immediately re-interrupt the thread
Thread.currentThread().interrupt();
// log the exception or [likely] quit the thread
}
codice JUnit che dimostra alcune di queste:
assertFalse(Thread.currentThread().isInterrupted());
// you can do this from another thread by saying: someThread.interrupt();
Thread.currentThread().interrupt();
// this method does _not_ clear the interrupt flag
assertTrue(Thread.currentThread().isInterrupted());
// but this one _does_ and should probably not be used
assertTrue(Thread.interrupted());
assertFalse(Thread.currentThread().isInterrupted());
Thread.currentThread().interrupt();
assertTrue(Thread.currentThread().isInterrupted());
try {
// this throws immediately because the thread is _already_ interrupted
Thread.sleep(1);
fail("will never get here");
} catch (InterruptedException e) {
// and when the InterruptedException is throw, it clears the interrupt
assertFalse(Thread.currentThread().isInterrupted());
// we should re-interrupt the thread so other code can use interrupt status
Thread.currentThread().interrupt();
}
assertTrue(Thread.currentThread().isInterrupted());
Questa è stata la prima passata alla base di codice che ho eseguito, tuttavia mi trovo di fronte a una situazione in cui i programmatori precedenti avrebbero rilevato un'eccezione generale anziché una interruptedException. – OverflowingStack