Behandeln von Ausnahmen, die von Threads ausgelöst werden
In Multithread-Anwendungen ist es wichtig, Ausnahmen zu behandeln, die von untergeordneten Threads im Hauptthread ausgelöst werden. Stellen Sie sich das folgende Szenario vor:
<br>public class Test erweitert Thread {<br> public static void main(String[] args) throws InterruptedException {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Test t = new Test(); try { t.start(); t.join(); } catch (RuntimeException e) { System.out.println("** RuntimeException from main"); } System.out.println("Main stoped");
}
@Override
public void run() {
try { while (true) { System.out.println("** Started"); sleep(2000); throw new RuntimeException("exception from thread"); } } catch (RuntimeException e) { System.out.println("** RuntimeException from thread"); throw e; } catch (InterruptedException e) { }
}
}
In diesem Beispiel wird eine im untergeordneten Thread ausgelöste Ausnahme nicht an den Hauptthread weitergegeben. Dies liegt daran, dass Java in Threads ausgelöste Ausnahmen nicht automatisch mit Handlern im Hauptthread verknüpft.
Lösung: Thread.UncaughtExceptionHandler
Um Ausnahmen von Threads zu behandeln, eine kann einen Thread.UncaughtExceptionHandler verwenden. Diese Schnittstelle stellt eine Methode uncaughtException() bereit, die aufgerufen wird, wenn eine nicht abgefangene Ausnahme in einem Thread auftritt.
Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread th, Throwable ex) { System.out.println("Uncaught exception: " + ex); } }; Thread t = new Thread() { @Override public void run() { System.out.println("Sleeping ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted."); } System.out.println("Throwing exception ..."); throw new RuntimeException(); } }; t.setUncaughtExceptionHandler(h); t.start();
Durch Festlegen des uncaughtExceptionHandler auf den Thread werden alle nicht abgefangenen Ausnahmen von der bereitgestellten Implementierung behandelt. Dadurch kann der Hauptthread Ausnahmen ordnungsgemäß erfassen und verarbeiten und so eine ordnungsgemäße Behandlung und Fehlerberichterstattung gewährleisten.
Das obige ist der detaillierte Inhalt vonWie kann ich mit Ausnahmen umgehen, die von untergeordneten Threads in Java ausgelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!