11.10.2 | Auslösen von Exceptions |
Bei parallelen Anwendungen kommt es vor, dass man einen Thread vom Auftreten einer Exception in einem anderen Thread benachrichtigen muss.
Die Klasse Thread stellt eine Variante der stop()-Methode bereit, die primär dazu gedacht ist, einen Thread zu beenden, die aber auch dazu verwendet werden kann, in einem anderen Thread eine Exception auszulösen:Thread.stop(Throwable o)Normalerweise wird diese Methode von der Parameter-freien Variante von stop() dazu benutzt, um einen Thread zu beenden, indem ein Exemplar von ThreadDeath übergeben wird. Wenn man stattdessen eine normale Exception übergibt, kann man diese in der run()-Methode des Ziel-Threads wie gewöhnlich abfangen. Diese Technik wirkt auch, falls der Ziel-Thread suspendiert ist, da diese Variante von stop() zunächst ein resume() durchführt.
Falls es möglich ist, die Benachrichtigung auch mit den üblichen Mitteln der Thread-Kommunikation über gemeinsam benutzte Datenelemente, die Piped-Streams oder auch Callbacks zu implementieren, ist dies auf jeden Fall vorzuziehen. Dies hat zwei Gründe:
Als Beispiel diene eine abgewandelte Form des TextThread -Beispiels am Anfang des Kapitels.
Das Hauptprogramm startet einen Thread und ruft nach Ablauf einer Wartezeit dessen stop()-Methode auf, wobei eine benutzerdefinierte Exception übergeben wird:public static void main(String args[]) { ExceptionThread thread; thread = new ExceptionThread("running"); thread.start(); try { Thread.currentThread().sleep(6000); } catch(InterruptedException e) { } thread.stop(new TestException()); }Falls die Exception an keiner Stelle der run()-Methode des Ziel-Threads ausgelöst wird, kann man sie als Unterklasse der RuntimeException vereinbaren, um die Compiler-Fehlermeldung, die Exception werde nicht im try-Statement ausgelöst, zu vermeiden.
Wenn man Exceptions verwendet, die nicht von RuntimeException abgeleitet sind, ist aus dem oben genannten Grund Vorsicht geboten.
Im Ziel-Thread kann man die Exception abfangen und entsprechend verarbeiten:public void run() { for(int i = 0; i < 10; i++) { try { sleep(2000); } catch(InterruptedException e) { } catch(TestException e) { System.out.println("caught exception"); } System.out.println(text); } }Material zum Beispiel
- Quelltexte: