InterruptedException in Java – Lösung für Thread-Unterbrechungsausnahme
In der Java-Multithread-Programmierung ist Thread-Unterbrechungsausnahme ein häufiges Problem und ein Problem, das Aufmerksamkeit erfordert. Wenn ein Thread ausgeführt wird und ein anderer Thread ihn unterbrechen möchte, wird eine InterruptedException ausgelöst. In diesem Artikel werden die Ursachen und Lösungen von InterruptedException erläutert.
InterruptedException ist eine Ausnahme, die aufgrund der Unterbrechung des Threads ausgelöst wird. Während ein Thread ausgeführt wird, kann ein anderer Thread ihn über die Methode interrupt() unterbrechen. Wenn sich der unterbrochene Thread in einem Wartezustand befindet, z. B. beim Warten auf E/A-Vorgänge oder beim Warten auf eine Sperre, wird eine InterruptedException ausgelöst.
Wenn beispielsweise Thread t1 im folgenden Code Thread.sleep() ausführt, unterbricht Thread t2 die Ausführung, sodass t1 eine InterruptedException-Ausnahme auslöst.
Thread t1 = new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { System.out.println("Thread interrupted"); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
Wenn ein Thread eine InterruptedException auslöst, müssen wir entsprechend der spezifischen Situation damit umgehen. Normalerweise sollten wir Thread.currentThread().interrupt() im Catch-Block aufrufen, um den Thread erneut zu unterbrechen, damit der obere Aufrufer weiß, dass der Thread unterbrochen wurde.
Im folgenden Code prüft der Thread t1 beispielsweise nach Abschluss der Ausführung, ob er unterbrochen wurde, und unterbricht sich im Catch-Block erneut.
Thread t1 = new Thread(() -> { try { Thread.sleep(5000); System.out.println("Thread finished"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Thread interrupted"); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
Wenn der Thread außerdem einige Vorgänge ausführt, die das Bereinigen von Ressourcen erfordern, z. B. das Freigeben von Sperren oder das Schließen von Dateien, sollten wir außerdem Reinigungsvorgänge im Catch-Block durchführen. Im folgenden Code gibt Thread t1 beispielsweise nach Abschluss der Ausführung Ressourcen frei und prüft, ob die Ausführung unterbrochen wurde.
Thread t1 = new Thread(() -> { Lock lock = new ReentrantLock(); lock.lock(); try { Thread.sleep(5000); System.out.println("Thread finished"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Thread interrupted"); } finally { lock.unlock(); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
Kurz gesagt, die Definition einer InterruptedException-Ausnahmebehandlungsmethode ist sehr wichtig. Sie kann uns helfen, Thread-Unterbrechungsvorgänge korrekt zu handhaben und die Komplexität des Codes so weit wie möglich zu reduzieren.
Das obige ist der detaillierte Inhalt vonInterruptedException in Java – Lösung für Thread-Unterbrechungsausnahme. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!