La scelta predefinita corretta è aggiungere InterruptedException all'elenco dei tiri. Un interrupt indica che un altro thread desidera che il thread termini. Il motivo di questa richiesta non è reso evidente ed è del tutto contestuale, quindi se non si dispone di alcuna conoscenza aggiuntiva si dovrebbe presumere che si tratti solo di un arresto amichevole e tutto ciò che evita tale arresto è una risposta non amichevole.
Java non genererà casualmente InterruptedException, tutti i consigli non influiranno sulla tua applicazione, ma ho riscontrato un caso in cui lo sviluppatore seguendo la strategia "rondine" è diventato molto scomodo. Una squadra ha sviluppato una vasta serie di test e ha usato Thread.Sleep molto. Ora abbiamo iniziato a eseguire i test nel nostro server CI e, a volte, a causa di difetti nel codice, rimanevamo bloccati in attese permanenti. A peggiorare la situazione, quando si è tentato di annullare il lavoro CI, non è mai stato chiuso perché il Thread.Interrupt che intendeva interrompere il test non ha interrotto il lavoro. Abbiamo dovuto accedere al box e terminare manualmente i processi.
Per farla breve, se semplicemente lanci InterruptedException stai abbinando l'intento predefinito che il tuo thread dovrebbe finire. Se non riesci ad aggiungere InterruptedException alla tua lista dei tiri, lo avvolgo in RuntimeException.
Esiste un argomento molto razionale secondo cui InterruptedException dovrebbe essere una RuntimeException stessa, poiché ciò incoraggerebbe una migliore gestione "predefinita". Non è una RuntimeException solo perché i progettisti si sono attenuti a una regola categorica che una RuntimeException dovrebbe rappresentare un errore nel codice. Poiché InterruptedException non deriva direttamente da un errore nel codice, non lo è. Ma la realtà è che spesso si verifica una InterruptedException perché c'è un errore nel tuo codice, (ad esempio loop infinito, dead-lock), e Interrupt è un altro metodo di thread per gestire quell'errore.
Se sai che c'è una pulizia razionale da fare, allora fallo. Se conosci una causa più profonda per l'interruzione, puoi assumere una gestione più completa.
Quindi, in sintesi, le tue scelte di gestione dovrebbero seguire questo elenco:
- Per impostazione predefinita, aggiungi ai tiri.
- Se non ti è permesso aggiungere ai tiri, lancia RuntimeException (e). (Migliore scelta di più opzioni errate)
- Solo quando conosci una causa esplicita dell'interruzione, gestisci come desideri. Se la tua gestione è locale al tuo metodo, reimposta interrotto da una chiamata a Thread.currentThread (). Interrupt ().