Il meccanismo di interruzione del thread è il modo migliore per ottenere un thread (cooperante) per rispondere a una richiesta per interrompere ciò che sta facendo. Qualsiasi thread (incluso il thread stesso credo) potrebbe chiamare interrupt()
un thread.
In pratica, i normali casi d'uso interrupt()
coinvolgono un qualche tipo di framework o manager che dice ad alcuni thread di lavoro di interrompere ciò che stanno facendo. Se il thread di lavoro è "consapevole delle interruzioni", noterà che è stato interrotto tramite un'eccezione o controllando periodicamente il suo flag interrotto. Notando che è stato interrotto, un thread ben educato abbandonerebbe ciò che sta facendo e finirebbe a se stesso.
Supponendo il caso d'uso di cui sopra, è probabile che il codice venga interrotto se viene eseguito all'interno di un framework Java o da un thread di lavoro. E quando viene interrotto, il codice deve abbandonare ciò che sta facendo e terminare se stesso con i mezzi più appropriati. A seconda di come è stato chiamato il codice, ciò potrebbe essere fatto restituendo o generando un'eccezione appropriata. Ma probabilmente non dovrebbe chiamare System.exit()
. (La tua applicazione non sa necessariamente perché è stata interrotta e di certo non sa se ci sono altri thread che devono essere interrotti dal framework.)
D'altra parte, se il tuo codice non è progettato per essere eseguito sotto il controllo di qualche framework, potresti sostenere che InterruptedException
è un'eccezione inaspettata; cioè un bug. In tal caso, dovresti trattare l'eccezione come faresti con gli altri bug; ad esempio, racchiudilo in un'eccezione non controllata e catturalo e registralo nello stesso punto in cui gestisci altre eccezioni non controllate impreviste. (In alternativa, l'applicazione potrebbe semplicemente ignorare l'interruzione e continuare a fare ciò che stava facendo.)
1) Se non interrompo mai altri thread da solo, cosa può attivare un'eccezione interrotta?
Un esempio è se i tuoi Runnable
oggetti vengono eseguiti utilizzando un ExecutorService
e shutdownNow()
viene chiamato sul servizio. E in teoria, qualsiasi pool di thread di terze parti o framework di gestione dei thread potrebbe legittimamente fare qualcosa di simile.
2) Se non interrompo mai personalmente altri thread usando interrupt () ... cosa significa InterruptedException
allora? Cosa dovrei fare dopo averne catturato uno? Chiudere la mia app?
È necessario analizzare la base di codice per capire cosa sta effettuando le interrupt()
chiamate e perché. Dopo averlo capito, puoi capire cosa >> la tua << parte dell'app deve fare.
Fino a quando non saprai perché InterruptedException
viene lanciato, ti consiglio di trattarlo come un errore difficile; es. stampa uno stacktrace nel file di registro e chiudi l'app. (Ovviamente, non è sempre la risposta giusta ... ma il punto è che questo è "un bug", e deve essere portato all'attenzione dello sviluppatore / manutentore.)
3) Come faccio a sapere chi / cosa sta chiamando interrupt()
?
Non c'è una buona risposta a questo. Il meglio che posso suggerire è di impostare un punto di interruzione sul Thread.interrupt()
e guardare lo stack di chiamate.