Multithread Programmierung...ExecutionCompletionService

kama

Top Contributor
Hallo,

schlage mich gerade mit der Multithread Programmierung rum...und habe folgendes Problem...

Ich habe bis dato einen eleganten Weg gefunden meine Threads zu starten...so weit so gut...

Java:
        ExecutorService exec = Executors.newFixedThreadPool(numberOfThreads);
        ExecutorCompletionService<Index> execCompletion = new ExecutorCompletionService<Index>(exec);
        ....
        VersionRange vr = readLogs.getVersionRange();
        ...
        for (VersionRange versionRange : versionRanges) {
            TaskXYZ task = new TaskXYZ(parameter, versionRange);
            execCompletion.submit(task);
        }

        //Warten bis alle fertig sind ...?
Nun ist die Frage: Wie kann ich es elegant anstellen, dass ich feststelle, ob alle gestarteten Threads auch beendet sind ?

Klar kann ich per execCompletion.poll() feststellen, ob Tasks beendet wurden...aber dann müste ich ja selbst die Task zählen...finde ich jetzt recht unelegant...

Das wäre Ausbaustufe Nr. 1...

Hätte da einer eine Idee oder einen Vorschlag ?

Vielen Dank im Voraus.
Gruß
Karl Heinz Marbaise
 

Marco13

Top Contributor
Der einfachste "Trick" dafür ist, die Tasks in eine Liste zu legen, und die dann an ExecutorService (Java Platform SE 7 ) (invokeAll) zu übergeben - die Methode wartet, bis alle fertig sind. Die Alternative wäre irgendwas mit Abfragen, Zählen, CountdownLatch & Co, ... wenn es keinen bestimmten Grund gibt und man diese "feine" (aber aufwändige) Kontrolle über die Zustände nicht braucht, sondern wirklich nur warten will, bis alle fertig sind, ist invokeAll IMHO das praktischste.

EDIT: Sorry, hab das mit dem ExecutorCompletionService übersehen (jaaa, trotz des Threadtitels :oops: ... nochmal schauen... :rtfm: )
EDIT2:... oder wolltest du nur genau DAS mit dem ExecutorCompletionService erreichen? ???:L
 
Zuletzt bearbeitet:

kama

Top Contributor
Hallo,

EDIT2:... oder wolltest du nur genau DAS mit dem ExecutorCompletionService erreichen? ???:L
In der ersten Ausbaustufe ja...aber....ich Denke ja schon ein wenig weiter....;-)

Derzeit ist es so, dass nach Ende der Task weiter Task gestartet werden sollen...also muss ich zuerst einmal warten bis all fertig sind...

In der Nächsten Ausbaustufe / Optimierungstufe möchte ich schon die Nachfolge Task starten, wenn eine bestimmte Anzahl von TaskXYZ erfolgreich beendet wurde (z.B. 8 ) , weil eben nicht all TaskXYZ die gleiche Laufzeit haben...weil ich Laufzeiten für TaskXYZ von Minuten bis zu 20-30 Minuten habe...

Gruß
Karl Heinz Marbaise
 

Gregorrr

Bekanntes Mitglied
Hmm, vielleicht hilft dir ja die Futures-Warteschlange:

Und zwar kannst du mit take() (Retrieves and removes the Future representing the next completed task, waiting if none are yet present) dir den nächsten abgearbeiteten Future holen. Wenn du nur 8 haben willst:
Java:
try {
  for (int i=0; i < 8; i++) {
    cs.take(); /* blockierend, d.h. wartet bis 8 Iterationen abgearbeitet / .get() für Resultat abzuholen */
  }
} catch (InterruptedException e) {
}

es.shutdown();
?
 

Marco13

Top Contributor
In der Nächsten Ausbaustufe / Optimierungstufe möchte ich schon die Nachfolge Task starten, wenn eine bestimmte Anzahl von TaskXYZ erfolgreich beendet wurde (z.B. 8 )

OK, denn sehe ich spontan auch keine elegantere Methode, als alles "von Hand" abzufragen (was aber auch daran liegen kann, dass ich mit der concurrent-API nicht nicht sooo viele use-cases durchgespielt habe) - aber so wie Gregorrr es beschrieben hat, hält sich der Aufwand ja in Grenzen...
 

kama

Top Contributor
Hallo,

Das macht man prinzipiell mit einer Barriere (z.B. java.util.concurrent.CyclicBarrier).
Hm..so weit ich CyclicBarrier verstanden habe ist ein CyclicBarrier dazu da Thread's untereinander zu synchronisieren....das möchte ich aber nicht....

Die Andere Idee Dazu wäre ein CountDownLatch()...hätte aber den Nachteil, dass jeder Thread zugriff auf CountDownLatch() haben müsste und ich somit eine implizite synchronization drin hätte...was ich vermeiden möchte...

Ich möchte nur warten bis alle Threads fertig sind...unabhängig davon das ein Thread 1 Minute benötigt hat und ein anderer 10 Minuten....

Gruß
Karl Heinz Marbaise
 

Marco13

Top Contributor
Das CountDownLatch hatte ich ja schon erwähnt - meinst du mit "implizite synchronisation" dass die Threads ggf. nacheinander das Latch runterzählen müssen, wenn sie gleichzeitig fertig werden? Irgendwo muss gezählt werden, und was "feingranulareres" als das Latch würde mir spontan nicht einfallen (sofern man's nicht selbst mit AtomicInt & Co nachbauen will...).

Aber nochmal allgemein, was genau willst du (in der "letzten Ausbaustufe") erreichen? Dass immer eine bestimmte Anzahl tasks gleichzeitig ausgeführt werden? Dass die Tasks in "Batches" aufgeteilt werden? ...

EDIT: Einfach auf alle warten würde ja mit invokeAll gehen, aber das reichte ja dann nicht...!?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu NullPointerException auf member, die per konstruktor gesetzt wird (multithread-kontext) Allgemeine Java-Themen 2
E Statement Multithread fähig? Allgemeine Java-Themen 2
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
D Vigenere Chiffre Programmierung Allgemeine Java-Themen 5
G Thread-Programmierung Allgemeine Java-Themen 5
R Input/Output Programmierung mithilfe der Robot Bibliothek Allgemeine Java-Themen 15
MiMa Programmierung von Bibliotheksklassen Allgemeine Java-Themen 3
zhermann Grundsatzfrage zur strukturierter Programmierung Allgemeine Java-Themen 5
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
P jCheckBox auf der zusammengeknüpften Programmierung anzeigen lassen Allgemeine Java-Themen 3
K Test-Frist Programmierung - wie vorgehen Allgemeine Java-Themen 5
C Programmierung von Fotoeffekten mit Java möglich? Allgemeine Java-Themen 3
J Rekursive Programmierung-Zählen von Ziffern Allgemeine Java-Themen 5
L Designfrage: Dispatcher-Programmierung - redundante Auslegung Allgemeine Java-Themen 1
E Sonderzeichen nicht setzbar: Großes Problem bei Programmierung unter Linux Mint mit Virtual Box Allgemeine Java-Themen 5
C BlackBox-Framework - Plugin Programmierung Allgemeine Java-Themen 4
S Objekt orientierte Programmierung Allgemeine Java-Themen 7
E Socket Client-Server-Programmierung Allgemeine Java-Themen 44
M Parallele Programmierung: volatile Variable nimmt ungewöhnlichen Wert an Allgemeine Java-Themen 3
C Open Soure Projekte für parallele Programmierung Allgemeine Java-Themen 6
E Thread Programmierung Allgemeine Java-Themen 2
E objektorientierte Programmierung Allgemeine Java-Themen 3
C Hilfe bei Adressbuch-Programmierung, wie am Besten mit JList implementieren Allgemeine Java-Themen 2
J Problem mit der Thread Programmierung Allgemeine Java-Themen 2
T Fehler bei der Programmierung eines Universaldienstbrowsers Allgemeine Java-Themen 3
J 3d-Programmierung Allgemeine Java-Themen 7
S BlueJ BlueJ - Geldautomat-Programmierung Allgemeine Java-Themen 2
G Funktionale Programmierung, OO- Programmierung, ... Allgemeine Java-Themen 9
J Hardware Programmierung Allgemeine Java-Themen 3
Kr0e Atomic / Lockfree Programmierung Allgemeine Java-Themen 11
6 Java - Threads - parallele Programmierung - Tutorial Allgemeine Java-Themen 6
I parallele Programmierung mit Java Allgemeine Java-Themen 3
X Error bei der Programmierung eines Sortieralgorithmus Allgemeine Java-Themen 2
J Modul/Komponenten/Addon-Programmierung Allgemeine Java-Themen 3
ModellbahnerTT Dynamische Programmierung, komme nicht weiter.... Allgemeine Java-Themen 15
S Applet Programmierung in Eclipse Allgemeine Java-Themen 12
B Observer vs Listener (GUI-Programmierung) Allgemeine Java-Themen 5
Developer_X Batch Programmierung Allgemeine Java-Themen 4
Developer_X Datei Programmierung Allgemeine Java-Themen 18
hdi Suche nach Begriff aus der Programmierung Allgemeine Java-Themen 11
K Programmierung einer Hilfe Allgemeine Java-Themen 6
G Threads programmierung Allgemeine Java-Themen 7
F Frage zu JSP / Java Programmierung Allgemeine Java-Themen 2
L Brauche Hilfe bei Memory Programmierung Allgemeine Java-Themen 2
G Framework für Multi-Prozessor-Programmierung? Allgemeine Java-Themen 4
tomtailor Mobiltelefon - Programmierung Allgemeine Java-Themen 8
O Oberfläche und "richtige" Programmierung Allgemeine Java-Themen 8
ven000m Constraint Programmierung Allgemeine Java-Themen 6
X Langsames Java im Bereich der GUI-Programmierung Allgemeine Java-Themen 8
F Klausuraufgaben Java-Programmierung Allgemeine Java-Themen 10
D Elegante Programmierung. Allgemeine Java-Themen 7
G Software für Java programmierung Allgemeine Java-Themen 5
J Frage zu Objektorientierter Programmierung Allgemeine Java-Themen 9
K Bubblesort Programmierung, finde Fehler nicht . Allgemeine Java-Themen 25
bernd Hardwarenahe Programmierung Allgemeine Java-Themen 14
S Taschenrechner und Programmierung Allgemeine Java-Themen 4
D Fraen zur Programmierung einer Volltextsuche Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben