2017-09-14 4 views
0

Angenommen, ich habe 5 Threads, die zu einer Threadgruppe mit dem Namen "Fruits-group" gehören. Wie kann ich UncaughtExceptionHandler allen Threads von Fruits-group auf einmal zuweisen?UncaughtExceptionHandler für eine Threadgruppe festlegen

Ich weiß, wir können eine globale UncaughtExceptionHandler für alle Threads definieren. Was ich suche ist eine UncaughtExceptionHandler zu einer gesamten Thread-Gruppe zuweisen?

Antwort

2

TL; DR Unterklasse die ThreadGroup und überschreiben die uncaughtException() Methode.

A ThreadGroupist ein UncaughtExceptionHandler, die uncaughtException(Thread t, Throwable e) Verfahren implementiert:

aufgerufen, durch die Java Virtual Machine, wenn ein Thread in diesem Thread-Gruppe wegen einer abgefangene Ausnahme beendet, und der Faden nicht über ein spezifischer Thread.UncaughtExceptionHandler installiert.

uncaughtException Die Methode der ThreadGroup führt Folgendes aus:

  • Wenn diese Fadengruppe ein Muttergewinde Gruppe aufweist, die uncaughtException Verfahren dieses Elternteils mit den gleichen zwei Argumenten aufgerufen wird.
  • Andernfalls überprüft diese Methode, ob ein standardmäßiger nicht abgefangener Ausnahmebehandler installiert ist. Ist dies der Fall, wird die Methode uncaughtException mit denselben zwei Argumenten aufgerufen.
  • Andernfalls bestimmt diese Methode, ob das Argument Throwable eine Instanz von ThreadDeath ist. Wenn ja, wird nichts Besonderes getan. Andernfalls wird eine Nachricht mit dem Namen des Threads, wie er von der getName Methode des Threads zurückgegeben wird, und einem Stack-Backtrace unter Verwendung der Methode printStackTrace in den Standardfehlerstream gedruckt.

Anwendungen können diese Methode in Subklassen von ThreadGroup außer Kraft setzen alternative Behandlung von nicht abgefangene Ausnahmen vorzusehen.


UPDATE

Wenn Sie in der Lage sein wollen, setzen eine UncaughtExceptionHandler für die ThreadGroup Sie eine Delegation von Unterklasse erstellen:

public class ExceptionHandlingThreadGroup extends ThreadGroup { 
    private UncaughtExceptionHandler uncaughtExceptionHandler; 

    public ExceptionHandlingThreadGroup(String name) { 
     super(name); 
    } 
    public ExceptionHandlingThreadGroup(ThreadGroup parent, String name) { 
     super(parent, name); 
    } 

    public UncaughtExceptionHandler getUncaughtExceptionHandler() { 
     return this.uncaughtExceptionHandler; 
    } 
    public void setUncaughtExceptionHandler(UncaughtExceptionHandler uncaughtExceptionHandler) { 
     this.uncaughtExceptionHandler = uncaughtExceptionHandler; 
    } 

    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     if (this.uncaughtExceptionHandler != null) 
      this.uncaughtExceptionHandler.uncaughtException(t, e); 
     else 
      super.uncaughtException(t, e); 
    } 
} 

Im Allgemeinen obwohl es wahrscheinlich besser wäre, nur implementieren die Ausnahmebehandlung Logik direkt in der Unterklasse, aber auf diese Weise können Sie eine vorhandene UncaughtExceptionHandler Implementierung verwenden.

+0

'öffentliche void uncaughtException (Thread t, Throwable e)'. Ich verstehe, dass wir eine Instanz von UncaughtExceptionHandler im zweiten Argument übergeben müssen, aber welche Thread-Instanz wir im ersten Parameter übergeben sollten: 'any oder der aktuelle Thread' –

+0

@PrakashPandey Was meinst du?Sie implementieren die Methode 'uncaughtException()' in einer Unterklasse von 'ThreadGroup' und die JVM ruft sie auf. Du nennst es nicht. Wenn Sie möchten, dass Ihre Unterklasse einen 'UncaughtExceptionHandler' übernimmt und ihn in einem Feld Ihrer Unterklasse speichert und den Aufruf von der Unterklasse' uncaughtException() 'Implementierung an den gegebenen' UncaughtExceptionHandler' weiterleitet, würden Sie die zwei Parameterwerte weitergeben . – Andreas

+0

danke, genau das, was ich gesucht habe. –

Verwandte Themen