Wenn ein Thread innerhalb von Object.wait()
oder Thread.join()
unterbrochen wird, wird ein InterruptedException
, ausgelöst, der den unterbrochenen Status des Threads zurücksetzt. . I. e, wenn ich eine Schleife wie diese in einem Runnable.run()
haben:Warum unterbrechen InterruptedExceptions den unterbrochenen Status eines Threads?
while (!this._workerThread.isInterrupted()) {
// do something
try {
synchronized (this) {
this.wait(this._waitPeriod);
}
} catch (InterruptedException e) {
if (!this._isStopping()) {
this._handleFault(e);
}
}
}
der Faden wird auch weiterhin nach dem Aufruf von interrupt()
laufen. Das bedeutet, dass ich explizit aus der Schleife ausbrechen muss, indem ich in der Schleifenbedingung nach meinem eigenen Stopp-Flag suche, die Ausnahme erneut auftrage oder eine break
hinzufüge.
Nun, das ist nicht wirklich ein Problem, da dieses Verhalten gut dokumentiert ist und mich nicht daran hindert, etwas zu tun, was ich will. Das Konzept dahinter scheint mir jedoch nicht nachvollziehbar zu sein: Warum wird ein Thread nach dem Auslösen der Ausnahme nicht mehr als unterbrochen betrachtet? Ein ähnliches Verhalten tritt auch auf, wenn Sie den unterbrochenen Status mit interrupted()
statt isInterrupted()
bekommen, dann wird der Thread auch nur einmal unterbrochen angezeigt.
Mache ich hier etwas Ungewöhnliches? Zum Beispiel, ist es häufiger die InterruptedException
außerhalb der Schleife zu fangen?
(Auch wenn ich nicht gerade ein Anfänger bin, habe ich dieses „Anfänger“ markiert, weil es wie eine sehr grundlegende Frage mir scheint, es zu betrachten.)
Da das, was du fragst, eine Frage der Meinung ist ("warum ist es so?"), Solltest du wahrscheinlich dieses Community-Wiki erstellen. –
@ Jonathan: Es ist nicht wirklich eine Frage der Meinung. Wenn man sich die API-Dokumente anschaut, ist klar, dass dahinter ein Grundprinzip stehen muss, also gibt es eine richtige Antwort auf meine Frage. Der von mir akzeptierte klingt sehr plausibel (thread safe interrupt handling). –