458 Stimmen

Behandlung von InterruptedException in Java

Was ist der Unterschied zwischen den folgenden Möglichkeiten, eine InterruptedException zu behandeln? Was ist der beste Weg, dies zu tun?

try {
 // ...
} catch (InterruptedException e) { 
   Thread.currentThread().interrupt(); 
}

...oder:

try {
 //...
} catch (InterruptedException e) {
   throw new RuntimeException(e);
}

Ich würde auch gerne wissen, in welchen Szenarien diese beiden verwendet werden.

4 Stimmen

5voto

TheIT Punkte 11363

Ich wollte nur eine letzte Option hinzufügen, die die meisten Leute und Artikel erwähnen. Wie mR_fr0g bereits erwähnt hat, ist es wichtig, den Unterbrechung richtig zu behandeln, entweder durch:

  • Weiterleitung der InterruptException

  • Wiederherstellen des Interrupt-Zustands des Threads

Oder zusätzlich:

  • Benutzerdefinierte Behandlung des Interrupts

Es ist nichts falsch daran, den Interrupt je nach Umständen auf benutzerdefinierte Weise zu behandeln. Da ein Interrupt eine Anforderung zur Beendigung ist, im Gegensatz zu einem Befehl, ist es völlig legitim, zusätzliche Arbeiten durchzuführen, um der Anwendung zu ermöglichen, die Anforderung ordnungsgemäß zu behandeln. Zum Beispiel, wenn ein Thread schläft, auf IO oder eine Hardwareantwort wartet, wenn er den Interrupt empfängt, ist es völlig legitim, alle Verbindungen ordnungsgemäß zu schließen, bevor der Thread beendet wird.

Ich empfehle dringend, das Thema zu verstehen, aber dieser Artikel ist eine gute Informationsquelle: http://www.ibm.com/developerworks/java/library/j-jtp05236/

1voto

Bjarne Boström Punkte 207

Ich würde sagen, dass es in einigen Fällen in Ordnung ist, nichts zu tun. Wahrscheinlich nicht etwas, das standardmäßig getan werden sollte, aber falls es keine Möglichkeit geben sollte, dass der Unterbrechung passiert, weiß ich nicht, was sonst zu tun ist (vielleicht Fehler protokollieren, aber das beeinflusst nicht den Programmfluss).

Ein Fall wäre, wenn Sie eine Aufgaben (blockierende) Warteschlange haben. Falls ein Daemon-Thread diese Aufgaben bearbeitet und Sie den Thread nicht selbst unterbrechen (meines Wissens nach unterbricht die JVM Daemon-Threads nicht beim Herunterfahren der JVM), sehe ich keine Möglichkeit für Unterbrechungen und daher könnte es einfach ignoriert werden. (Ich weiß, dass ein Daemon-Thread jederzeit von der JVM beendet werden kann und daher in einigen Fällen ungeeignet ist).

EDIT: Ein weiterer Fall könnten bewachte Blöcke sein, zumindest laut dem Tutorial von Oracle unter: http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

1 Stimmen

Dies ist ein schlechter Ratschlag. Es fällt mir äußerst schwer, an irgendeine Aufgabe zu denken, die so wichtig ist, dass Interrupts ignoriert werden sollten. Oracle war wahrscheinlich einfach faul und wollte keinen (weiteren) Ballast zu Thread.sleep() hinzufügen. Es sei denn, Sie wissen, warum Ihr Thread unterbrochen wird, sollten Sie alles stoppen, was Sie gerade tun (entweder zurückkehren oder eine Ausnahme erneut werfen, um Ihrem Thread zu helfen, so schnell wie möglich zu beenden).

1 Stimmen

Das ist der Grund, warum ich manchmal sage. Auch weil es bisher noch nicht vorgeschlagen wurde und meiner Meinung nach in einigen Fällen völlig in Ordnung ist. Ich denke, es hängt davon ab, welche Art von Software Sie erstellen, aber wenn Sie einen 24/7-Arbeiter-Thread haben, der niemals stoppen sollte (abgesehen davon, dass die JVM heruntergefahren wird), würde ich Unterbrechungen z.B. beim Entnehmen eines Elements aus einer BlockingQueue als Fehler behandeln (d.h. protokollieren), da "es nicht passieren sollte" und es erneut versuchen. Natürlich würde ich separate Flags haben, um das Programmende zu überprüfen. In einigen meiner Programme ist das Herunterfahren der JVM kein Ereignis, das unter normalen Betriebsbedingungen auftreten sollte.

1 Stimmen

Oder anders ausgedrückt: Meiner Meinung nach ist es besser, das Risiko einzugehen, zusätzliche Fehlerprotokollmeldungen zu haben (und z. B. Mails bei Fehlerprotokollen zu senden), als eine Anwendung, die 24/7 laufen sollte, aufgrund einer InterruptException zum Anhalten zu bringen, für die ich während normaler Bedingungen keinen Weg sehe, wie sie passieren könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X