Threads Exceptions von Threads abfangen im ThreadPool

redbomber

Bekanntes Mitglied
Hi zusammen,
brauch mal wieder euren Rat.

Ich habe folgenden Fall bei mir implementiert:
Java:
   class MyWorkerClass {

      public doAction_a(){
      try{
         Thread myThread = new MyThread(){
            // run calls runSub()
            runSub() throws Exception{
               //special work
            }
         }
         runThread(myThread);
      }catch{
         handleException_a();
      }
   }

// ... doAction_b(), doAction_c() ...

      public doAction_z(){
      try{
         Thread myThread = new MyThread(){
            // run calls runSub()
            runSub() throws Exception{
              // special work
            }
         }
         runThread(myThread);
      }catch{
         handleException_z();
      }
   }   
   }

D.h. ich habe eine Klasse, die verschiedene Methoden anbietet um spezielle Aufgaben zu erledigen.
Jede Aufgabe wir in einem extra Thread ausgeführt. Die Methode runThread(Thread) startet den jeweiligen Thread.
Man beachte hierbei
Java:
handleException_a()
und
Java:
handleException_z()

So nun will ich aber das ganze durch einen Thread pool erweitern.
Mein Thread pool erhält die Aufgaben übergeben und kümmert sich um alles weitere.

Nun habe ich aber das Problem dass ich nicht weiss wie ich die Exceptions, die ich hier mit den Methoden
Java:
handleException_a()
und
Java:
handleException_z()
bearbeite.

Java:
   class MyWorkerClass {

      public doAction_a(){
//      try{
         Runnable myWork = new MyWork(){
            runSub() throws Exception{
               //special work
            }
//         }
         submitWork(myThread); //wirft ja keine Exception mehr
//      }catch{
//         handleException_a();
//      }
   }

      public doAction_z(){
//      try{
         Runnable myWork = new MyWork(){
            // run calls runSub()
            runSub() throws Exception{
              // special work
            }
//         }
         submitWork(myThread); //wirft ja keine Exception mehr
     // }catch{
     //    handleException_z();
     // }
   }   
   }

Meine
Java:
submitWork(myThread);
nimmt nur ein Runnable entgegen und wirft KEINE Exception. Es übergibt die Aufgabe an meinen ThreadPool.
Die Exception wird wenn dann in der run() Methode meines Runnable geworfen.
Wie soll ich die denn dann abfangen?

Also versteht ihr was mein Problem ist?

Mein ThreadPool weiss ja nichts über die Aufgabe die mein Runnable zu tun hat.
Er startet einfach die Aktion.
Bisher kümmert sich meine Methode
Java:
handleException_z()
dass eine Aufgaben-spezifische Aktion bei einer Exception ausgeführt wird.
Mit meiner ThreadPool implementierung weiss ich gerade nicht wie ich das realisieren soll.
 

truesoul

Top Contributor
Sammel dich nochmal weil ich das z.B nicht verstehe:

Nun habe ich aber das Problem dass ich nicht weiss wie ich die Exceptions, die ich hier mit den Methoden
Java:
handleException_a()
und
Java:
handleException_z()
bearbeite.

Ja was? ;)

Die Exception wird wenn dann in der run() Methode meines Runnable geworfen.
Wie soll ich die denn dann abfangen?

Mit ein try/catch Block?

Und wenn submitWork(..) eine Exception werfen könnte dann deklariere es doch.
Bzw leite es weiter.

Java:
public void submitWork()throws IrgendeineException{
....
}
Somit brauchst du in der Methode kein Try/Catch Block aber dort wo du diese Methode aufrufst.

Ansonsten:
Java ist auch eine Insel – 7 Exceptions
 
S

SlaterB

Gast
was macht eigentlich handleException_a() -z, fängt das nur Fehler bei der Thread-Initialisierung ab oder auch für den laufenden Thread?

Java:
 public doAction_a(){
      try{
         Thread myThread = new MyThread(){
            // run calls runSub()
            runSub() throws Exception{
               //special work
            }
         }
         runThread(myThread);
      }catch{
         handleException_a();
      }
   }
falls runThread() nämlich einen separaten Thread für myThread startet, dann ist das handleException_a() für den runSub()-Aufruf aus dem Spiel,
oder macht runThread() bisher selber die Arbeit? dann wäre es komisch, Thread-Objekte zu erstellen..




---------

definiere dir Objekte eines Interface
Java:
Runner {
    doWork();
    doException();
}
in der Methode doAction_a() wird ein Runner-Objekt erstellt, doWork() erhält //special work + runSub() , doException() erhält handleException_a(),

dann muss irgendwo irgendjemand
Java:
Runner r = ..;
try {
  r.doWork();
} catch() {
  r.doException();
}
direkt hintereinander stehen haben, und ob man das dann in einem ThreadPool oder woanders ausführt ist fast egal

soweit eine Bewertung, je nach schon vorhandenen Indirektionen (runSub() ) usw. kann man das vielleicht auch anders machen,
MyThread ist vielleich schon genau Runner usw., man muss sich nicht mit Interfacen überfluten

wichtig aber schon jetzt: try/catch besser nicht für a-z 26x kodieren, das sollte einmal reichen,
ThreadPool dürfte daran wenig ändern
 

redbomber

Bekanntes Mitglied
Hi zusammen,
also euch beiden vielen Dank für die Antworten. Ich weiss war leider etwas verwirrend wie ich es erklärt habe...

@truesoul
Also ich habe eine Runnable, welches eine spezifische Aktion ausführt.
Wenn eine Exception in der run() Methode auftritt, wird diese geworfen und bisher durch mein Try-Catch-Block abgefangen. Im catch wird dann wieder ein spezifisches Handling ausgeführt handleException_xyz();

Nun habe ich im Hintergrund einen ThreadPool, welches meine Runnables einfach übergeben bekommt
Java:
submitWork(Runnable)
.
Mein submitWork(Runnable) wirft keine Exception, sondern übergibt die Aufgabe nur an den ThreadPool der alles weitere macht...
Mein ThreadPool ist sozusagen unwissend über die Aktion die ein Runnable enthält, sowie dessen spezifischen Excepion Handlings. Ich denke so solls ja sein.

@SlaterB
was macht eigentlich handleException_a() -z, fängt das nur Fehler bei der Thread-Initialisierung ab oder auch für den laufenden Thread?
Also meine handleException_xyz() fängt nur eine Expection während des laufenden Threads ab.

Also mein runThread(myThread); ist kurz wie folgt implementiert:
Java:
runThread(myThread){
...
 myThread.start();
...
}
Dient also nur zum starten des Thread (natürlich gibts dann noch Arbeit drumherum, daher in eine Hilfs-Methode verpackt)

definiere dir Objekte eines Interface
Java:
Runner {
    doWork();
    doException();
}
Ok, ich glaub jetzt hab ich es kapiert. Das ist genau das womit ich gerade mein Problem hatte.
In meiner Klasse initialisiere ich mein Runnable und gebe an welche Arbeit er machen soll.
Dieses Runnable übergebe ich meinem ThreadPool und der macht alles weitere.
Mir war nicht klar, wie ich auch den Code für den Fall einer Exception an das Runnable übergebe...
Klar, genauso wie ich ihm die Arbeit übergebe! Danke!

wichtig aber schon jetzt: try/catch besser nicht für a-z 26x kodieren, das sollte einmal reichen,
[/code]
Wie meinst denn das?
Also mein Interfcae von Runnable definiert jetzt dann auch eine doException();
Und die werde ich bei jeder Initialisierung von meinen Runnables implementieren.
Ich muss die ja für jedes Runnable implementieren, da jedes Runnable bei mir eine andere Arbet macht und somit auch eine eigene Exception hat.
 
Zuletzt bearbeitet:

redbomber

Bekanntes Mitglied
puh...
um es jetzt noch komplizierter zu machen:

Wenn eine andere Klasse A die Methode doAction_a() der Klasse B aufruft:

Java:
public doAction_a() throws Exception{

         Thread myThread = new MyThread(){

            doWork() throws Exception{
               //do work
            }


            doException() throws Exception{
               //do Exception handling
               // or throw Exception
            }
         }
         submitTask(myThread); // übergebe Runnable an ThreadPool
   }

Und dann in meinem ThreadPool irgendwo dann mein Runnable gestartet wird, so wie du es beschrieben hast:
Java:
Runner r = ..;
try {
  r.doWork();
} catch() {
  r.doException();
}

Wenn dann also mein r.doException(); eine Exception WIRFT, dann würde diese ja normal an die aufrufende Klasse A weitergeleitet werden.
Nun ja aber nicht mehr, da alles in meinem ThreadPool verkapselt ist und mein ThreadPool ja nichts von der aufrufenden Klasse weiss.
Gibts dafür dann überhaupt noch eine Lösung?

Versteht da noch irgendwer was ich meine?
 
S

SlaterB

Gast
> Wie meinst denn das?
so wie geschrieben, es gibt nur irgendwo ein try/catch, welches doException() aufruft, welches vielleicht a-z mal implementiert ist,
aber es braucht nicht 26 try/catches

-----

zwischen Threads Exceptions zu übergeben ist generell schwierig, so ist Fussball, äh Nebenläufigkeit,
das war aber vorher auch schon so falls da wirklich Threads waren, deswegen bezweifle ich auch dass das try/ catch + handleException_a() funktioniert hat,
entweder kam es nie zum tragen oder wenn doch, dann war es kein richtiger Thread,

für Nebenläufigkeit: ob du einen eigenen Thread oder ein Runnable-ähnliches Ding in einen Pool hast macht bei den technischen Möglichkeiten ein bisschen Unterschied, aber fachlich kannst du alles in beiden ausdrücken,
irgendein zuständiges Objekt X wird es wohl geben, das kann sich der Aufrufer merken bevor es in die Nebenläufigkeit geht,
- dies kann einen Zustand haben wie laufend/ Fehler/ ordentlich zu Ende,
- dies kann Listener aufnehmen die bei wichtigten Ereignissen direkt informieren
- es kann synchronisiert gewartet werden
- na mehr hab ich auch nicht zu sagen, ist schon gut was dabei ;)

wo wie was implementiert ist, ist natürlich die Frage, ich erinnere nochmal an die EINE Codestelle
Java:
Runner r = ..;
try {
  r.doWork();
} catch() {
  r.doException();
}
solche zentralen aktiven Codes, die für alle Abläufe drankommen, bieten sich dann natürlich auch für Aufrufe a la

Java:
Runner r = ..;
try {
  r.doWork();
} catch() {
  r.doException();
  r.setLevel(Level.Error);
  r.informListener();
}
an, wobei das natürlich auch intern passieren kann,
und sowas wie setLevel() sollte natürlich keine Interface-Methode sein die 26x implementiert wird, sondern wieder nur einmal,
z.B. in einer Basisklasse, MyThread klang ja stark nach Klasse statt Interface
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Threads und Exceptions Allgemeine Java-Themen 7
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
M Exceptions - wann / wie verwenden? Allgemeine Java-Themen 4
W Exceptions behandeln Allgemeine Java-Themen 16
Kirby.exe Exceptions erklärt Allgemeine Java-Themen 5
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
J Exceptions Allgemeine Java-Themen 1
Z Java Exceptions - Auf leeres Feld prüfen Allgemeine Java-Themen 10
E Exceptions abfangen und dann Programm stoppen - aber wie? Allgemeine Java-Themen 2
L Nullpointer Exceptions werden nicht angezeigt Allgemeine Java-Themen 5
V Exceptions Allgemeine Java-Themen 2
G Exceptions mit jre 7u40 Allgemeine Java-Themen 2
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
E LookAndFeel Exceptions bei UIManager.setLookAndFeel Allgemeine Java-Themen 4
W JavaDoc Runtime-Exceptions: Wie sinnvoll anzeigen? Allgemeine Java-Themen 14
B Webstart Exceptions Allgemeine Java-Themen 7
S Runtime Exceptions in eine Datei schreiben Allgemeine Java-Themen 7
G Internationalisierung von Exceptions Allgemeine Java-Themen 5
J JUnit - werfen von Exceptions testen Allgemeine Java-Themen 17
F Alle Exceptions abfangen Allgemeine Java-Themen 4
B Alle Exceptions auf einmal abfangen Allgemeine Java-Themen 4
G log4j - Behandlung nicht explizit abgefangener Exceptions Allgemeine Java-Themen 5
B Logging von Exceptions Allgemeine Java-Themen 7
G Designfrage: Exceptions in Konstruktoren Allgemeine Java-Themen 7
I Exceptions - weder catch- noch finally-Klausel funktioniert Allgemeine Java-Themen 12
M Verwendung von unchecked exceptions & bereits vorhandenen exceptions was priorisieren Allgemeine Java-Themen 3
hdi Verhalten bei nicht behandelten Exceptions Allgemeine Java-Themen 2
H Exceptions und IO Allgemeine Java-Themen 17
B Exceptions? Allgemeine Java-Themen 4
D Throws Exceptions Allgemeine Java-Themen 14
M Verständnisfrage Exceptions Allgemeine Java-Themen 2
V Exceptions als Fehlerbehandlung "missbrauchen"? Allgemeine Java-Themen 10
DEvent Wie behandelt man Exceptions in Iterator? Allgemeine Java-Themen 2
J Verständnisfrage zu exceptions Allgemeine Java-Themen 3
A Junit Exceptions testen Allgemeine Java-Themen 3
R Loading-Thread und Exceptions abfangen. Allgemeine Java-Themen 4
P Exceptions dokumentieren. Allgemeine Java-Themen 6
G Exceptions weiterwerfen Allgemeine Java-Themen 2
T Generics und Exceptions Allgemeine Java-Themen 6
P Exceptions throw Allgemeine Java-Themen 6
F Wann und wie Exceptions einsetzen? Allgemeine Java-Themen 13
J Method.invoke -> Exceptions der Funktion abfangen Allgemeine Java-Themen 5
T Frage zu Exceptions Allgemeine Java-Themen 3
G Java-Exceptions werden nicht ganz angezeigt. Wo ändern? Allgemeine Java-Themen 3
J Probleme mit Exceptions Allgemeine Java-Themen 11
R Exceptions mit aktuellen Programminformationen ausgeben? Allgemeine Java-Themen 2
märliprinz com.sap.dbtech.jdbc.exceptions.JDBCDriverException Allgemeine Java-Themen 2
G Alle Exceptions loggen Allgemeine Java-Themen 4
G Frage zu Exceptions Allgemeine Java-Themen 6
M err oder alle Exceptions eines Programms abfangen Allgemeine Java-Themen 4
G Exceptions ohne Zeilennummer (Unknown Source) Allgemeine Java-Themen 8
T Exceptions im statischem Klassencode Allgemeine Java-Themen 5
rode45e Java Threads Allgemeine Java-Themen 4
M Threads Allgemeine Java-Themen 1
L Threads Threads in Chatroom Allgemeine Java-Themen 30
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
W Wieviele Threads sind sinnvoll? Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
G Threads vom Mainprogramm steuern Allgemeine Java-Themen 8
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
x46 Threads Threads anhalten Allgemeine Java-Themen 1
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
W Threads Problem Allgemeine Java-Themen 15
T Threads Tic Tac Toe mit Threads Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
J Internet Broswer in Threads öffnen Allgemeine Java-Themen 1
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
D Threads Parallel laufende Threads Allgemeine Java-Themen 4
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
J Threads Threads Allgemeine Java-Themen 9
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
Tausendsassa Input/Output Problem mit der gleichzeitigen Ausgabe zweier Threads Allgemeine Java-Themen 8
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
M Threads JPanel eingeforen mit Threads Allgemeine Java-Themen 2
F Threads Allgemeine Java-Themen 6
F Threads Allgemeine Java-Themen 2
M Sinn von Threads? Allgemeine Java-Themen 1
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
P Threads Java Zugreifen Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
K KeyEvent in Threads Allgemeine Java-Themen 11
V Threads Weshalb funktionieren meine Threads nicht? Allgemeine Java-Themen 2
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
L Threads beenden Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben