Heim Java javaLernprogramm Einführung in die allgemeine Methode der Ausnahmebehandlung in Java-Subthreads

Einführung in die allgemeine Methode der Ausnahmebehandlung in Java-Subthreads

Sep 26, 2017 am 09:27 AM
java 处理 异常

Der folgende Editor bringt Ihnen einen Artikel über Ausnahmebehandlungsmethoden in Java-Subthreads (allgemein). Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor, um einen Blick darauf zu werfen

In einem gewöhnlichen Single-Thread-Programm sind zum Abfangen von Ausnahmen nur try...catch...finally...Codeblöcke erforderlich. Wenn also in einer gleichzeitigen Situation beispielsweise ein untergeordneter Thread im übergeordneten Thread gestartet wird, wie kann dann die Ausnahme vom untergeordneten Thread im übergeordneten Thread abgefangen und entsprechend behandelt werden?

Häufige Fehler

Manche Leute denken vielleicht, dass es sehr einfach ist, direkt dort zu versuchen, wo der übergeordnete Thread den untergeordneten Thread beginnt ... zu fangen Man macht es einfach, aber eigentlich ist das falsch.

Ursachenanalyse

Erinnern wir uns an die vollständige Signatur der run-Methode der Runnable-Schnittstelle, da die throws-Anweisung nicht identifiziert wird Die Methode löst keine aktivierte Ausnahme aus. Bei ungeprüften Ausnahmen wie RuntimeException wird der übergeordnete Thread nicht benachrichtigt, wenn eine Ausnahme auftritt, da der neue Thread von der JVM geplant und ausgeführt wird.

public abstract void run()

Lösung

Also, wie man die Daten aus dem untergeordneten Thread im erfasst Übergeordneter Thread Was ist mit Ausnahmen? Der Autor hat sich drei gängige Methoden ausgedacht und sie mit allen geteilt.

Methode 1: try...catch...

Umschließen Sie im Unterthread die Stellen, an denen Ausnahmen auftreten können, mit try ...fangen... Aussagen. Sub-Thread-Code:


public class ChildThread implements Runnable {
 public void run() {
  doSomething1();
  try {
   // 可能发生异常的方法
   exceptionMethod();
  } catch (Exception e) {
   // 处理异常
   System.out.println(String.format("handle exception in child thread. %s", e));
  }
  doSomething2();
 }
}
Nach dem Login kopieren

Methode 2: Legen Sie den Ausnahmehandler UncaughtExceptionHandler für den Thread

< fest 🎜> Ausnahmehandler für Thread festlegen. Die spezifischen Methoden können wie folgt sein:

(1) Thread.setUncaughtExceptionHandler legt den Ausnahmehandler des aktuellen Threads fest

(2) Thread.setDefaultUncaughtExceptionHandler legt den Standard-Ausnahmehandler für das gesamte Programm fest, wenn Wenn der aktuelle Thread über einen Ausnahmehandler verfügt (Standard ist keiner), wird zuerst die Klasse UncaughtExceptionHandler verwendet. Andernfalls wird der ExceptionHandler der Threadgruppe verwendet. Der globale Standard DefaultUncaughtExceptionHandler wird verwendet; wenn keiner vorhanden ist, wird der untergeordnete Thread beendet.

Hinweis: Im untergeordneten Thread tritt eine Ausnahme auf, die die Verarbeitung übernimmt, und wird direkt beendet, ohne Protokolle zu hinterlassen. Wenn Sie also nichts unternehmen, kommt es zu einem „seltsamen“ Phänomen, bei dem die Sub-Thread-Aufgabe nicht ausgeführt wird und keine Protokollaufforderung erfolgt.

Legen Sie den Ausnahmehandler für den aktuellen Thread fest:


public class ChildThread implements Runnable { 
 private static ChildThreadExceptionHandler exceptionHandler;

 static {
  exceptionHandler = new ChildThreadExceptionHandler();
 }

 public void run() {
  Thread.currentThread().setUncaughtExceptionHandler(exceptionHandler);
  System.out.println("do something 1");
  exceptionMethod();
  System.out.println("do something 2");
 }

 public static class ChildThreadExceptionHandler implements Thread.UncaughtExceptionHandler {
  public void uncaughtException(Thread t, Throwable e) {
   System.out.println(String.format("handle exception in child thread. %s", e));
  }
 }
}
Nach dem Login kopieren
Oder legen Sie den Standard-Ausnahmehandler für alle Threads fest


public class ChildThread implements Runnable {
 private static ChildThreadExceptionHandler exceptionHandler;

 static {
  exceptionHandler = new ChildThreadExceptionHandler();
  Thread.setDefaultUncaughtExceptionHandler(exceptionHandler);
 }

 public void run() {
  System.out.println("do something 1");
  exceptionMethod();
  System.out.println("do something 2");
 }

 private void exceptionMethod() {
  throw new RuntimeException("ChildThread exception");
 }

 public static class ChildThreadExceptionHandler implements Thread.UncaughtExceptionHandler {
  public void uncaughtException(Thread t, Throwable e) {
   System.out.println(String.format("handle exception in child thread. %s", e));
  }
 }
}
Nach dem Login kopieren
Befehlszeilenausgabe: Tun Sie etwas 1

Ausnahme im untergeordneten Thread behandeln.

Methode Drittens: Fangen Sie die Ausnahme über die get-Methode von Future ab.

Verwenden Sie den Thread-Pool, um eine Methode zu senden, die die Rückgabeinformationen abrufen kann, d. h. ExecutorService.submit(Callable) kann sie abrufen Ein Thread zur Ausführung nach dem Senden des resultierenden Future-Objekts. Wenn im untergeordneten Thread eine Ausnahme auftritt, kann beim Abrufen des Rückgabewerts über Future.get () die ExecutionException-Ausnahme abgefangen werden, wodurch bekannt ist, dass im untergeordneten Thread eine Ausnahme aufgetreten ist untergeordneter Thread.

Code des untergeordneten Threads:


public class ChildThread implements Callable {
 public Object call() throws Exception {
  System.out.println("do something 1");
  exceptionMethod();
  System.out.println("do something 2");
  return null;
 }

 private void exceptionMethod() {
  throw new RuntimeException("ChildThread1 exception");
 }
}
Nach dem Login kopieren
Code des übergeordneten Threads:


public class Main {
 public static void main(String[] args) {
  ExecutorService executorService = Executors.newFixedThreadPool(8);
  Future future = executorService.submit(new ChildThread());
  try {
   future.get();
  } catch (InterruptedException e) {
   System.out.println(String.format("handle exception in child thread. %s", e));
  } catch (ExecutionException e) {
   System.out.println(String.format("handle exception in child thread. %s", e));
  } finally {
   if (executorService != null) {
    executorService.shutdown();
   }
  }
 }
}
Nach dem Login kopieren
Befehlszeilenausgabe: Etwas tun 1

Ausnahme im untergeordneten Thread behandeln java.lang.RuntimeException: ChildThread1-Ausnahme

Zusammenfassung

Die oben genannten sind drei häufig verwendete Methoden zur Ausnahmebehandlung von Java-Sub-Threads. Tatsächlich hat sich der Autor auch mehrere andere Lösungen für bestimmte Szenarien ausgedacht. Ich werde sie an einem anderen Tag analysieren. Vielen Dank für Ihre Unterstützung

Das obige ist der detaillierte Inhalt vonEinführung in die allgemeine Methode der Ausnahmebehandlung in Java-Subthreads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

See all articles