Multi-Threading mit join()

Luk10

Top Contributor
Hallo,

Vorab: Ja ich weiß es gab schon viele Themen dazu, aber keins hat mir wirklich weitergeholfen, da es mir hier um Grundlagen geht.

> Ich habe eine List von Objekten die in einer Endlosschleife immer wieder abgearbeitet werden muss (Berechnungen auf den Objekten durchführen).
> Ich will, dass das abarbeiten der Objekte auf 2 (4) Threads verteilt wird um die CPU voll auszulasten

Meine Fragen:
> Wo und wann werden die Threads erstellt? (Ständig neue Threads? Nur einmal 2 (4) Threads?)
> Was genau passiert in der run() Methode? (Endlosschleife und warten auf neue Teilliste? Nur eine! Abarbeitung der Teilliste?
> Wo und wann muss join() verwendet werden und was genau macht es?

Wäre auch dankbar wenn ihr mir dazu ein Tutorial-Link geben könntet. "Java ist auch eine Insel" hilft mir nicht, hab ich schon angeschaut.

-Luk10-
 
M

Marcinek

Gast
Ich stelle fest du bist fast 3 Jahre Mitglied in diesem Forum. Da hätte ich so ein Posting nicht erwartet.

Vorab: Ja ich weiß es gab schon viele Themen dazu, aber keins hat mir wirklich weitergeholfen, da es mir hier um Grundlagen geht.

Wieso haben sie dir nicht geholfen? Welche Tutorials? Wieso müssen wir Links suchen, die auch google finden kann?

Meine Fragen:
> Wo und wann werden die Threads erstellt? (Ständig neue Threads? Nur einmal 2 (4) Threads?)
> Was genau passiert in der run() Methode? (Endlosschleife und warten auf neue Teilliste? Nur eine! Abarbeitung der Teilliste?
> Wo und wann muss join() verwendet werden und was genau macht es?

Ich finde es merkwürdig, dass zu dazu keine Antworten gefunden hast. Das sind ja keine Fragen, wo man sagt: UHHH noch nie gehabt.

1) Wieso sollten, wenn ich 2 Threads erstelle immer wieder neue Threads erstellt werden?

2) In Run methode passiert genau das, was du implementiert hast.

3) Siehe JavaDoc.

Wäre auch dankbar wenn ihr mir dazu ein Tutorial-Link geben könntet. "Java ist auch eine Insel" hilft mir nicht, hab ich schon angeschaut.

Wo hast du den ein Problem?
 

Volvagia

Top Contributor
Ich würde eine (!) LinkedBlockingQueue für alle 4 Threads benutzen. Mit take() holen sie sich einfach die Elemente, arbeiten sie ab und kehren zum Anfang zurück. Dann hast du einen Aufbau ähnlich den EDT: Von außen werden Operations-Events eingetragen und die Threads arbeiten sie ab. Rückgabe der Ergebnisse könnte per Listener erfolgen. Oder direkt eingetragen in die Events, obwohl Listener vermutlich einfacher zu managen sind.

join() wirst du vermutlich garnicht brauchen, das blockiert den aufrufenden Thread bis der aufgerufene Thread terminiert.
 

Luk10

Top Contributor
Mir ist sehr wohl bewusst, dass man vorher selber auf Google / Youtube sucht bevor man etwas fragt. Das habe ich auch getan. Hättest du das auch getan hättest du vielleicht herrausgefunden, dass es da nicht wirklich viel gutes, Grundlagen-erklärendes gibt!

3) Siehe JavaDoc.

Ich kann JavDoc lesen. Da steht:
Waits for this thread to die.
An invocation of this method behaves in exactly the same way as the invocation

Was soll das bedeuten? "Waits for this thread to die"? Wieso soll der Thread sterben? Dann müsste ich ja ständig neue erstellen.

Die meisten Tutorials die ich angeschaut habe, verwenden keine "endlose" Abarbeitung von einer Liste und müssen sich nicht den Fragen stellen wie die Wiederholung umgesetzt werden soll.

Nur weil für dich einige Ding "offensichtlich" sind, sind sie es für mich nicht!

-Luk10-
 
G

Gast2

Gast
Zu deiner Frage: Ein Thread stirbt genau dann wenn er seine run() Methode durchlaufen hat.
 

Volvagia

Top Contributor
Der Thread stirbt, sobald die run-Methode nach außen verlassen wurde. Und der Aufrufer wartet eben bis der Thread, von dem join() aufgerufen wurde terminiert. Hat ja keiner gesagt, dass du das brauchen wirst.

btw. auf YT habe ich noch nie gesucht. Oo
 

Luk10

Top Contributor
Was machen Threads in der Zeit, in der sie gerade keine neuen Objekt mit take() holen können, weil keine mehr in der Liste sind und extern die Liste wieder aufgefüllt werden muss?

[OT]Auf Youtube gibt es eine Fülle an mehr oder weniger guten Tutorials[/OT]
 
M

Marcinek

Gast
Was machen Threads in der Zeit, in der sie gerade keine neuen Objekt mit take() holen können, weil keine mehr in der Liste sind und extern die Liste wieder aufgefüllt werden muss?

Entweder schlafen (sleep) oder sterben ;) (Klingt witzig ist aber so ^^)

as habe ich auch getan. Hättest du das auch getan hättest du vielleicht herrausgefunden, dass es da nicht wirklich viel gutes, Grundlagen-erklärendes gibt!

:lol:
 

JavaProfi

Aktives Mitglied
Hallo,


> Ich will, dass das abarbeiten der Objekte auf 2 (4) Threads verteilt wird um die CPU voll auszulasten

Meine Fragen:
> Wo und wann werden die Threads erstellt? (Ständig neue Threads? Nur einmal 2 (4) Threads?)
> Was genau passiert in der run() Methode? (Endlosschleife und warten auf neue Teilliste? Nur eine! Abarbeitung der Teilliste?
> Wo und wann muss join() verwendet werden und was genau macht es?

Wäre auch dankbar wenn ihr mir dazu ein Tutorial-Link geben könntet. "Java ist auch eine Insel" hilft mir nicht, hab ich schon angeschaut.

-Luk10-


Das was du suchst ist ein "Threadpool".
Dazu stellt Java die Schnittstelle Executer und eine Utility-Klasse Executors bereit.
Da die Konstruktoren der Executer nicht ganz trivial sind, bietet die Utility-Klasse einen einfacheren Zugang.

So liefert
Java:
ExecutorService executor = Executors.newFixedThreadPool( int n )
einen Thread-Pool mit maximal n Threads.

Diesem Threadpool können nun beliebig Objekte vom Typ runnable übergeben werden:

Java:
executor.execute( r1 ); 
executor.execute( r2 );

...

executor.execute( r100 ); 
executor.shutdown();

Dabei sind r1 bis r100 alles runnable-objects, die nun durch die n Threads abgearbeitet werden.

Da die n Threads des Threadpool ja nie sterben würden, musst du den Threadpool am Ende mit dem shutdown() "herunterfahren". Das bewirkt nichts anderes, als dass alle n Threads nun beendet werden und damit sterben.

Gruß
JP
 
Zuletzt bearbeitet:

JavaProfi

Aktives Mitglied
Da die n Threads des Threadpool ja nie sterben würden, musst du den Threadpool am Ende mit dem shutdown() "herunterfahren". Das bewirkt nichts anderes, als dass alle n Threads nun beendet werden und damit sterben.

Eine kleine aber wichtige Ergänzung noch.
Ein shutdown() beendet die Threads nicht sofort.
Es sorgt zunächst dafür, dass keine neuen Jobs mehr vom Threadpool angenommen werden und erst wenn alle Jobs im jobbuffer abgearbeitet sind, dann terminieren die Threads.

Gruß
JP
 

Luk10

Top Contributor
Kann man mit dem executor auch nach einer Runde "Abarbeiten" die Ergebnisse verarbeitet werden, bevor eine neue Runde Objekte abgearbeitet wird?
 

Luk10

Top Contributor
An welchem Punkt in der Methode sind alle tasks abgearbeitet?

Java:
try {

	executor.invokeAll(tasks);

} catch (InterruptedException e) {

	e.printStackTrace();

}

// Sind hier alle tasks abgearbeitet?
 

JavaProfi

Aktives Mitglied
Kann man mit dem executor auch nach einer Runde "Abarbeiten" die Ergebnisse verarbeitet werden, bevor eine neue Runde Objekte abgearbeitet wird?

JA über das interface "callable" und "Future"-Objekten und in deinem beschrieben fall mit einem ScheduledExecutorService. an statt eines normalen ExecutorService

Gruß
JP
 
Zuletzt bearbeitet:

Marco13

Top Contributor
An welchem Punkt in der Methode sind alle tasks abgearbeitet?

Wie auch in der Doku steht, sind ist nach
executor.invokeAll(tasks);
alle Tasks aus der übergebenen Liste abgearbeitet. Ggf. kann man danach einen neuen Stapel Tasks als list übergeben. Es scheint mir aber, als wäre es gut, wenn du genauer beschreiben würdest, was du vorhast....
 

vimar

Bekanntes Mitglied
also ich würde mir "ForkJoin" ansehen, gibts wohl erst seit java 7.

ansonsten haste 4 threads, die erstmal tot sind und nur deklariert sind.

und dann hab ich das immer so gemacht: while (counter < liste.size()) if (!(thread1.isAlive()) thread1 = new thread1(...)... counter++..;

und nach der while schleife einfach abfragen ob alle 4 threads noch alive sind, falls einer alive ist dann den join() und fertig. auslastung 100%
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Fehlerbereinigung bei Multi Threading Anwedung Allgemeine Java-Themen 2
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
M Jdeps-Error durch multi-release Allgemeine Java-Themen 6
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
J Swing Ermittlung der Bildschirmauflösung von Multi-Monitor-Systemen Allgemeine Java-Themen 12
M MessageFormat : multi line Allgemeine Java-Themen 10
Q JConsole - CPU Usage Multi-Core Allgemeine Java-Themen 2
T Java Logging API in Multi Threaded API Allgemeine Java-Themen 2
L remote debugging of a multi threaded system Allgemeine Java-Themen 2
G Framework für Multi-Prozessor-Programmierung? Allgemeine Java-Themen 4
G Java Anwendung für Multi-User Allgemeine Java-Themen 2
D Datei Suche: Multi Threaded Allgemeine Java-Themen 8
M Bitte Testen: Mein Multi-File Editor Allgemeine Java-Themen 30
G Vectoren Threads, und Multi Operationen Allgemeine Java-Themen 15
A Synchronisation Datenquelle und Anwendung (Multi-User) Allgemeine Java-Themen 7
Tarrew Threading - Unregelmäßige Lock-Vergabe Allgemeine Java-Themen 0
Thallius Ist Background-Threading in Java wirklich so schwer? Allgemeine Java-Themen 7
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
B Threading Allgemeine Java-Themen 23
R Threading und Rekursion führen zu “GC overhead limit exceeded” Allgemeine Java-Themen 4
SuperSeppel13 Bilder auf Anfrage laden - Threading Allgemeine Java-Themen 3
J Threading / Callables Allgemeine Java-Themen 8
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
F Threading oder kein Threading - das ist hier die Frage. Allgemeine Java-Themen 23
A join."," von python in java Allgemeine Java-Themen 3
A eine test thread.join() frage Allgemeine Java-Themen 2
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
V Fork Join bei Arraylist Allgemeine Java-Themen 6
T Frage zu Join bei Threads Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben