Executor fragen ob fertig

xZise

Aktives Mitglied
Moin,
ich habe aktuell das Problem, dass ich darauf warten muss, dass mehrere Threads fertig werden.

Ich versuche das zu beschreiben: Und zwar mache ich sowas ähnliches wie QuickSort, wobei ich die beiden Teile die nachher übrig bleiben in einen einzelnen Thread ablaufen lasse. Allerdings sollen maximal 4 Threads laufen. Also nehme ich mir ein Executor mit maximal 4 Threads und erstelle eine Aufgabe, alle Elemente zu sortieren. Diese Aufgabe selber jetzt stellt dann die Aufgabe die Teile zu sortieren und so weiter.

Irgendwann ist er aber fertig, und wie kriege ich das mit um dann die sortierte Folge nutzen zu können? Ich dachte zuerst ich gucke solange im Hauptthread bis die Aufgaben leerlaufen, aber der Executor ist da nicht sehr informativ.

MfG
Fabian

PS: Ich selber mache etwas anderes, aber das mit QuickSort beschreibt es wohl am besten.
 
S

SlaterB

Gast
was für einen Executor verwendest du denn?
wenn ich mir das SubInterface
ExecutorService (Java 2 Platform SE 5.0)
anschaue, dann liefert jedes submit() ein Future-Objekt zurück, welches du abfragen könntest,

ansonsten ganz allgemein müsstest du deinen vier Threads irgendwas mitgeben, bei dem sie sich alle am Ende ihrer Aufgabe selber melden können
 

xZise

Aktives Mitglied
was für einen Executor verwendest du denn?[...]
Java:
ExecutorService executor = Executors.newFixedThreadPool(4);
wenn ich mir das SubInterface
ExecutorService (Java 2 Platform SE 5.0)
anschaue, dann liefert jedes submit() ein Future-Objekt zurück, welches du abfragen könntest,[...]
Aber das submit nimmt doch eine Aufgabe und gibt ein Objekt zurück und das wartet dann, bis es zuende ist. Aber ich selber kenne doch nicht die letzte Aufgabe auf die ich dann warten könnte.

[...]ansonsten ganz allgemein müsstest du deinen vier Threads irgendwas mitgeben, bei dem sie sich alle am Ende ihrer Aufgabe selber melden können
Okay da müsste ich mir was überlegen.

MfG
Fabian
 
S

SlaterB

Gast
> Aber ich selber kenne doch nicht die letzte Aufgabe auf die ich dann warten könnte.

du musst auf alle 4 Rückgaben warten, Reihenfolge egal,
wenn alle 4 ok zurückgegeben, dann ist genau der Endzeitpunkt erreicht
 

ice-breaker

Top Contributor
du musst auf alle 4 Rückgaben warten, Reihenfolge egal,
wenn alle 4 ok zurückgegeben, dann ist genau der Endzeitpunkt erreicht
neija das Problem ist einfach, wenn er einen Task submitted, wird dieser weitere erstellen (Quicksort-Konzept gilt ja auch hier).
Der Task dürfte für die Futures also nicht fertig sein, solange nicht die Sub-Tasks fertig sind, aber diese können erst von dem ThreadPool ausgeführt werden, wenn der aktuelle Task fertig ist.


Ich würde es folgendermaßen machen:
einen ThreadPool mit Größe 4 nutzen und den Ursprungstask submitten, dabei wird ein Semaphor auf 0 gestellt.
Nun haben wir eine ConcurrentLinkedList-Warteschlange in der die Tasks gespeichert werden, ist ein Task fertig und gibt es weitere Tasks, werden diese in die Warteschlange eingefügt, bevor der Task zu Ende ist. Wenn irgendwann die Warteschlange leer ist und alle Threads fertig sind, wird der Semaphor auf 1 gesetzt, womit die Berechnung als fertig gilt.
Nicht leicht zu lösen.
 

xZise

Aktives Mitglied
Moin,
wie wäre es, wenn ich einfach bei jeden erstellen eines Tasks einen Zähler erhöhe und wenn dieser fertig ist, denn entsprechend verringere?

Und dann muss ich nur gucken ob der Null ist, und kann aufhören? Das einzige Problem (wo ich auch nicht fit in Java bin) ist der Threadkontext. Das heißt am besten wäre es irgendwie, wenn das Zählerverändern vom Thread angestoßen aber vom Mainthread ausgeführt wird irgendwie.

MfG
Fabian
 

xZise

Aktives Mitglied
Moin,
ich fürchte aktuell nicht mehr, da der aktuelle Algorithmus so nicht funktioniert. Das heißt da muss ich mir was überlegen, und komme dann eventuell wieder auf die Frage zurück.

MfG
Fabian
 

ice-breaker

Top Contributor
also ich würde zwar jetzt eine funktionierende Lösung hinbekommen (im Gegensatz zu dem oberen), aber ich muss ehrlich gesagt sagen, dass sie sehr heftig ist, wenn man alle Synchronisierungs- und Deadlock-Probleme beseitigt und wirklich doch einige Stunden zum Implementieren benötigen würde.

Deswegen mein Tipp, mach es dir einfach und erzeuge 4 Threads die je 1/4 des Arrays bearbeiten, sollte einer mal früher sein als der andere ignoriere, dass du noch eine Optimierung hättest rausholen können.
 

Jay_030

Aktives Mitglied
So wie ich dich verstanden habe, hast du eine fixe Anzahl Threads, die eine Datenstruktur beackern und brauchst, wenn alle fertig sind, noch einen "Ergebnisthread". Hört sich nach einem Fall für die CyclicBarrier an.

Schau es dir mal, vielleicht hilft es ja. Ich habe damit schon sehr gute Erfahrungen gemacht bei solchen Berechnungsgeschichten. Zumal man seinen sequentiellen Algortihmus dadurch schnell und sicher auf mehrere Threads aufteilen kann.

Edit: Oder du nutzt eine CountDownLatch.
 
Zuletzt bearbeitet:

xZise

Aktives Mitglied
Moin,
okay also aktuell steht wieder Multithreading im Haus.

So sieht es aktuell aus: Ich habe n Dateien die ich in k Threads mit einem ThreadPoolExecutor abackern möchte und wenn alle n Dateien fertig sind, soll sich ein Button aktivieren.

Das beackern werde ich wohl noch schaffen, aber dann ist die Frage, wie ich den Button aktiviere. Mit so einem CountDownLatch wäre das natürlich perfekt, aber ich möchte im Dialog auch anzeigen, wie weit ich bin, d.h. der Latch blockiert das sich das erneuert.

MfG
Fabian
 

Jay_030

Aktives Mitglied
Das Aktualisieren der Oberfläche während der Bearbeitung würde ich mittels Listenern lösen.

Deine n Workerthreads (besser nur Runnables) bekommen alle eine Referenz auf die Latch, welche mit der Anzahl n initialisiert wurde. Am Ende eines Workerthreads wird die countDown()-Methode der Latch ausgeführt. In der Oberfläche - von der aus du sicherlich die Berechnung startest - wartest du auf die Berechnung mittels der await()-Methode der Latch. Für eine Aktualisierung der Oberfläche mit Fortschrittanzeige kannst du zwei Möglichkeiten nutzen:
  • Jeder Worker führt Buch über seinen Fortschritt (eine einfaches Attribut) und informiert mittels PropertyChangeListener die GUI über Änderungen des Fortschritt-Attributes, die sich daraufhin aktualisiert.
  • Du arbeitest mit SwingWorker. Diese Klasse bietet dir die Möglichkeit Teilergebnisse weiterzugeben.
Was für dich besser geeignet ist, weiß ich nicht. Ich denke, die Lösung mittels PropertyChangeListener lässt sich schneller in deine bereits bestehenden Worker implementieren. Wichtig ist, dass du die die PropertyChangeListener auch im EventDispatch-Thread aufrufst (z.B. mittels SwingUtilities.invokeLater(...)).
 

xZise

Aktives Mitglied
Moin,
naja aktuell geht es nur darum, dass ich n Bilder rendern muss, und das wollte ich parallelisieren in dem ich halt einen Threadpool nehme mit maximal k Threads. Soweit ist das kein Problem. Eher die Frage ist halt, wie ich den Fenster sage: Ein mehr von den n Bildern ist fertig. Ich dachte schon sowas wie an ein Listener, aber ich weiß nicht ob das Probleme macht wenn das aus den Threadkontext aufgerufen wird.

MfG
Fabian
 

Jay_030

Aktives Mitglied
Ich dachte schon sowas wie an ein Listener, aber ich weiß nicht ob das Probleme macht wenn das aus den Threadkontext aufgerufen wird.
Wie gesagt:
Jay_030 hat gesagt.:
Wichtig ist, dass du die die PropertyChangeListener auch im EventDispatch-Thread aufrufst (z.B. mittels SwingUtilities.invokeLater(...)).


Das könnte dann in etwa so aussehen in deiner Worker-Klasse (ungetestet):

Java:
for (final PropertyChangeListener listener : allListeners)
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            listener.propertyChange(...);
        }
    });

Mit dem PropertyChangeEvent schickst du der GUI den aktuellen Fertigstellungsstatus und die Threads kommen sich nirgends ins Gehege.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kr0e Sichtbarkeitsregeln nach Executor-Aufruf Allgemeine Java-Themen 5
D Executor Service nach getaner Arbeit beenden Allgemeine Java-Themen 3
O Unterschied zwischen ThreadPoolExecutor und Executor Service Allgemeine Java-Themen 7
Zrebna Fragen zu Testabdeckungs-Metriken Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
K BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren) Allgemeine Java-Themen 141
V Ich hätte 2 Fragen Allgemeine Java-Themen 5
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
H Fragen zur Kraken Api Allgemeine Java-Themen 1
nonickatall Klassen Grundsätzliche Fragen zu geplanter Programmstruktur Allgemeine Java-Themen 5
W Ein paar Fragen zu .properties und .css Allgemeine Java-Themen 6
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
X Fragen zur Javamail API und Gmail Allgemeine Java-Themen 4
T Fragen bezgl. Lambdas Allgemeine Java-Themen 20
X Collections Fragen zu gleichen Elementen in TreeSet Allgemeine Java-Themen 35
A Neuerungen in Java 8 StreamAPI- Paar fragen Allgemeine Java-Themen 4
temi Fragen zur Software-Architektur Allgemeine Java-Themen 123
M Diverse Design-Fragen Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
M Fragen beantworten über Textfeldeingabe Allgemeine Java-Themen 5
D Grundsätzliche Fragen zum Heap Space Allgemeine Java-Themen 12
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
M Allgemeine Fragen meinerseits Allgemeine Java-Themen 4
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
R Es gibt keine dummen Fragen (hab ich mal gehört) Allgemeine Java-Themen 11
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
2 2 Klein Fragen Allgemeine Java-Themen 7
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
A Java Theorie-Fragen Allgemeine Java-Themen 7
K Java QUIZ-Spiel Fragen und Antworten generieren?! Allgemeine Java-Themen 5
R Socket Fragen zu UDP Allgemeine Java-Themen 1
B Noob-Fragen zu Tablets und PC kompatiblität... Allgemeine Java-Themen 6
D Ein paar allgemeine Fragen zu Java Allgemeine Java-Themen 19
L Fragen für Facharbeit: Analyse von Strings in Java Allgemeine Java-Themen 4
R Fragen zu Server + UI Allgemeine Java-Themen 2
U Vier Fragen zu Java Allgemeine Java-Themen 2
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
D Fragen zum erstellen einer ausführbaren Jar Datei Allgemeine Java-Themen 3
C Polymorphie Fragen zur Annotations von Persistenz Allgemeine Java-Themen 2
O Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI Allgemeine Java-Themen 7
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
Luk10 Fragen zum ByteBuffer (lwjgl - icons) Allgemeine Java-Themen 2
F Akkumulator Hough-Transformation offene Fragen Allgemeine Java-Themen 4
Luk10 Fragen zu Naming-Conventions Allgemeine Java-Themen 5
Z Einige Fragen Allgemeine Java-Themen 10
T OOP Einige Fragen zu UML-Klassendiagrammen Allgemeine Java-Themen 6
G Einige Fragen zu ResourceBundles Allgemeine Java-Themen 2
S Fragen zu verschiedenen Themen vom JCreator Allgemeine Java-Themen 2
DStrohma Grundsätzliche Fragen zum Aufbau eines komplexeren Programmes Allgemeine Java-Themen 8
Semox Grapheneditor - Allgemeine Fragen zum Logikdesign Allgemeine Java-Themen 3
O kleine Fragen eines Anfängers Allgemeine Java-Themen 2
nrg Swing 2 Fragen zu Swing/AWT Allgemeine Java-Themen 7
K Reflections Fragen Allgemeine Java-Themen 7
S Fragen zum SCJD-Zertifikat Allgemeine Java-Themen 2
M Backend Entwicklung - Konzept fragen Allgemeine Java-Themen 3
E Fragen zu Scala Allgemeine Java-Themen 11
Daniel_L Fragen zu RegEx und URL umwandeln Allgemeine Java-Themen 4
J Diverse Fragen bezüglich Jasper Allgemeine Java-Themen 3
S Fragen zum ShutdownHook Allgemeine Java-Themen 7
V Fragen zu einem Java Browser Allgemeine Java-Themen 7
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
M Drag and Drop: 3 Fragen Allgemeine Java-Themen 3
L Einige Fragen zu Java Allgemeine Java-Themen 9
F Linguistische Fragen zu Javadoc bzw. Englisch Allgemeine Java-Themen 4
E Einfache Fragen zu Dateien Allgemeine Java-Themen 7
E Thread Fragen in Verbindung mit Swing Allgemeine Java-Themen 4
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
H Java Multiplicoice Test (10 Fragen) Allgemeine Java-Themen 11
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
D Grundsätzliche Fragen zur Grafikdarstellung in Spielen Allgemeine Java-Themen 2
J 2 Fragen zu JMF und eine Rechtsfrage Allgemeine Java-Themen 3
S Viele Fragen eines Umsteigers (von .NET) Allgemeine Java-Themen 6
C LinkedList Fragen Allgemeine Java-Themen 7
P Fragen zur JBuilder und den kosten. Allgemeine Java-Themen 7
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
I Fragen zum Internetseiten Einlesen/Auswerten Allgemeine Java-Themen 5
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
S 2 Fragen allgemeine fragen zu final und interface Allgemeine Java-Themen 13
M ein paar fragen über JBoss und Catalina Allgemeine Java-Themen 7
D Allgemeine Fragen zum Speichern Allgemeine Java-Themen 3
F allgemeine Fragen zu Java Allgemeine Java-Themen 9
S Fragen zu 4 speziellen Listen Allgemeine Java-Themen 4
U JFrame, JOptionPane - vor dem Schließen Benutzer fragen Allgemeine Java-Themen 10
I zwei simple fragen Allgemeine Java-Themen 22
G 2 Fragen Allgemeine Java-Themen 7
G Fragen zu ausführbaren JAR Files Allgemeine Java-Themen 23
G Fragen zu JTextField bzw. JTextArea Allgemeine Java-Themen 2
J 5 Fragen. Allgemeine Java-Themen 2
P Tausend Fragen... Allgemeine Java-Themen 3
J Warten bis cmd Prozess fertig ist Allgemeine Java-Themen 2
B Datei überprüfen, ob diese Freigeben ist oder fertig geschrieben wurde Allgemeine Java-Themen 3
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
S ThreadPoolExecutor: wie stelle ich fest dass meine Threads im Pool mit ihrer Arbeit fertig sind? Allgemeine Java-Themen 3
X Wann ist Runtime.getRuntime().exec mit Copy fertig? Allgemeine Java-Themen 10
R Thread beenden und warten, bis er fertig ist Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben