Se un thread viene interrotto all'interno di Object.wait()
o Thread.join()
, esso genera uno InterruptedException
, che ripristina lo stato interrotto del thread. . I. e, se ho un ciclo come questo all'interno di un Runnable.run()
:Perché interruptedExceptions cancella lo stato interrotto di un thread?
while (!this._workerThread.isInterrupted()) {
// do something
try {
synchronized (this) {
this.wait(this._waitPeriod);
}
} catch (InterruptedException e) {
if (!this._isStopping()) {
this._handleFault(e);
}
}
}
il filo continua a funzionare dopo la chiamata interrupt()
. Ciò significa che devo uscire esplicitamente dal ciclo controllando il mio flag di stop nella condizione del loop, rilanciare l'eccezione o aggiungere uno break
.
Ora, questo non è esattamente un problema, dal momento che questo comportamento è ben documentato e non mi impedisce di fare nulla nel modo che voglio. Tuttavia, non riesco a capire il concetto alla base: perché un thread non è più considerato interrotto una volta che l'eccezione è stata lanciata? Un comportamento simile si verifica anche se si ottiene lo stato interrotto con interrupted()
anziché isInterrupted()
, quindi, il thread verrà visualizzato solo una volta.
Sto facendo qualcosa di insolito qui? Ad esempio, è più comune catturare lo InterruptedException
all'esterno del ciclo?
(Anche se io non sono esattamente un principiante, ho taggata questo "principiante", perché sembra una domanda molto semplice per me, a guardarla.)
Dato che quello che chiedi è una questione di opinione ("perché è così?") Dovresti probabilmente creare questo wiki della comunità. –
@ Jonathan: Non è davvero una questione di opinione. Osservando i documenti dell'API, è chiaro che dietro a questo deve esserci una logica, quindi c'è una risposta corretta alla mia domanda. Quello che ho accettato sembra molto plausibile (gestione degli interrupt sicuri dei thread). –