35 Stimmen

Welche Art von Verhalten verursacht eine unterbrochene Ausnahme?

Ich bin relativ neu bei Threading in Java und ich habe bemerkt, dass jedes Mal, wenn ich Thread.sleep() verwende, ich InterrupetdException abfangen muss.

Welche Art von Verhalten verursacht dies, und in einfachen Anwendungen, wo ich einen Monitor-Thread haben kann ich einfach die Ausnahme ignorieren?

30voto

Dan Dyer Punkte 52915

Es passiert, wenn etwas ruft [unterbrechen()](http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#interrupt()) zum Thema. Dieser Artikel von Brian Goetz erklärt den Unterbrechungsmechanismus und wie Sie InterruptedExceptions behandeln sollten:

"Die häufigste Reaktion auf eine InterruptedException ist, sie zu schlucken - sie abzufangen und nichts zu tun (oder sie vielleicht zu protokollieren, was auch nicht besser ist) - wie wir später in Listing 4 sehen werden. Leider gehen bei diesem Ansatz wichtige Informationen darüber verloren, dass eine Unterbrechung aufgetreten ist, was die Fähigkeit der Anwendung beeinträchtigen könnte, Aktivitäten abzubrechen oder rechtzeitig herunterzufahren."

"Wenn Sie eine InterruptedException abfangen, sie aber nicht zurückwerfen können, sollten Sie den Beweis aufrechterhalten, dass die Unterbrechung aufgetreten ist [...]. Diese Aufgabe wird durch den Aufruf von interrupt() erfüllt, um den aktuellen Thread "erneut zu unterbrechen"."

8voto

madlep Punkte 43822

Wie andere bereits gesagt haben, wird dies durch einen anderen Thread verursacht, der interrupt() über die Thread Objekt, das sich im Ruhezustand befindet.

Das bedeutet im Klartext, dass ein anderer Thread beschlossen hat, den schlafenden Thread zu löschen. Der try/catch-Block ist da, damit Sie die Stornierung des Threads anständig behandeln und alle Ressourcen sicher bereinigen oder die Operation, die er korrekt ausgeführt hat, beenden können.

Wenn Sie nichts von alledem tun müssen, dann brauchen Sie trotzdem einen leeren Catch-Block. Aber das ist Java für Sie...

7voto

jassuncao Punkte 4635

Einige Ratschläge aus Java Concurrency in Practice:

  • die Ausnahme weitergeben (möglicherweise nach einer aufgabenspezifischen Bereinigung), wodurch Ihre Methode ebenfalls zu einer unterbrechbaren blockierenden Methode wird; oder
  • Stellen Sie den Unterbrechungsstatus wieder her, damit der Code weiter oben auf dem Aufrufstapel damit umgehen kann.
  • Nur Code, der die Unterbrechungsrichtlinie eines Threads implementiert, darf eine Unterbrechungsanforderung schlucken. Allgemeiner Task- und Bibliothekscode sollte niemals Unterbrechungsanforderungen schlucken.

3voto

Jon Skeet Punkte 1325502

Der erste Fall ist, wenn jemand anruft [Thread.interrupt()](http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#interrupt()) zu Ihrem Thema.

Es kann sicherer sein, eine RuntimeException zu werfen, wenn es passiert, wenn Sie es wirklich nicht erwarten, aber für sehr einfache Fälle können Sie es wahrscheinlich ignorieren.

3voto

Miguel Ping Punkte 17786

Von der javadocs :

Klasse InterruptedException

T schläft oder anderweitig für eine lange Zeit pausiert lange Zeit a unterbricht ihn mit der Interrupt Methode in der Klasse Thread.

Ich hoffe, das beantwortet Ihre Frage.

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