Warten bis alle Threads fertig sind

Sophie

Bekanntes Mitglied
Hallo

Ich komme weiss hier leider nicht mehr weiter. Ich habe eine Klasse die Matrizen multipliziert und das Ergebnis dann einfach auf der Konsole ausgeben soll. Das funktioniert alles. Jetzt möchte ich das ganze mit Threads machen. Jetzt gibt es aber Probleme mit der Ausgabe auf der Konsole, da jeder Thread wie er möchte in die pringMatrix() Methode reingeht und irgendwas ausgegeben wird.

Hier erstmal der Code

Java:
@Override
	public void run() {

		for (int i = 0; i < arrA[0].length; i++) {
			C = new int[arrA.length][arrB[0].length];
			int id = Integer.parseInt(Thread.currentThread().getName());
			System.out.println("\nThread: " + id);
			for (int j = 0; j < arrA[0].length; j++) {
				for (int k = 0; k < arrB[0].length; k++)
					C[i][j] += arrA[i][k] * arrB[k][j];
			}
		}
		printMatrix(C);
		System.exit(0);
	}

	void printMatrix(int[][] c) {

		for (int i = 0; i < c.length; i++) {
			for (int j = 0; j < c[i].length; j++) {
				System.out.print(c[i][j] + " ");
			}
			System.out.println();
		}
	}

Ich habe schon mehrere Sachen ausprobiert, funktioniert aber nicht wirklich. Ich denke die Beste Lösung wäre eine while -Schleife, aber ich weiss nicht so ganz was ich dort reinschreiben sollte. Müsste sowas sein wie (wenn C noch nicht komplett gefüllt). Habe auch mit sleep() versucht, funktioniert aber auch nicht.
Kann mir jemand weiterhelfen?
 

njans

Top Contributor
Wenn du Thread.join() aufrufst, dann wird so lange gewartet, biss der Thread fertig ist.
Also einfach aus deiner start-methode join() auf jeden Thread aufrufen.
Wenn das nicht reicht, dann müsste man mal schauen, was das concurrency-package als Barrier anbietet :)
 

Michael...

Top Contributor
Was hast Du mit den Threads vor und was erwartest Du Dir davon? Sollen die etwa alle in der selben Matrizze rumrechnen?
Was soll das System.exit(0) in der run-Methode?
 

Sophie

Bekanntes Mitglied
hm, ja mit join() habe ich auch versucht, aber dann macht ja der erste thread der reinkommt alles und die restlichen sind überflüssig. oder verstehe ich da etwas falsch?
 
Zuletzt bearbeitet:

njans

Top Contributor
Nun ich nehme mal an, du startest ja die Threads ungefähr so:
Java:
for (...)
new Thread(parameter);

Da kannst du ja die Threads in einem Array speichern:
Java:
Thread[] myThreads;
for (...)
myThreads[..]  = new Thread(parameter);

Und dann kannst du alle auf jeden Thread im Array join() aufrufen.
 

Michael...

Top Contributor
Aber das was du in der run() machst macht doch nicht viel Sinn. Die äußer for Schleife wiederholt A[0].length mal das selbe?? Und verwirft x mal das neu erstellte und befüllte C.
Wenn Du jede Ergebniszeile in einem eigenen Thread errechnen lassen willst benötigst Du ja A.length Threads. Jeder Thread muss ein int[] der Länge B[0].length berechnen. (wenn man die erste "Dimension" als Zeilenindex und die zweite "Dimension" als Spaltenindex interpretiert)
Sobald ein Thread fertig ist fügt er entsprechend seines "Zeilenindexes" das ermittelte int[] an die passende Stelle von C ein und erhöht z.B. synchronisiert einen Zähler und informiert z.B. einen Beobachter, der sobald der Zähler, der Anzahl der Threads also A.length entspricht somit weiss, dass die Berechnung abgeschlossen ist und C ausgegeben werden kann.
 

Sophie

Bekanntes Mitglied
Wenn ich join() einsetze, dann sieht die Ausgabe schon mal besser aus. Das Problem ist aber, das jeder Thread einmal über die Methode geht und ausgibt. Es sollte aber nur einmal sein. Ist es irgendwie möglich, dass zum Beispiel nur der erste oder der letzte Thread der dort ankommt ausgibt?

Michael, tut mir Leid, Du hast Recht. Ich hänge schon ziemlich lange an diesem Code und hab den wohl zwischendurch mal geändert. Richtig sollte es so aussehen

Java:
for (int i = 0; i < arrA.length; i++) {
			for (int j = 0; j < arrB[0].length; j++) {
				for (int k = 0; k < arrA[0].length; k++) {
					C[i][j] += arrA[i][k] * arrB[k][j];				
				}
			}
		}
 
S

Spacerat

Gast
1. Mit [c]join()[/c] hintereinander auf jeden Thread erlebt man so manche Überraschung bzw. Exceptions oder Deadlocks - z.B. wenn ein Thread schon beendet wurde bevor [c]join()[/c] aufgerufen wird.
2. Es gibt da das paket java.util.cocurrent, damit sollte es gehen.
3. Da gibt es noch die Klasse [c]Threadgroup[/c] und in dieser eine [c]interrupt()[/c]-Methode für alle Threads innerhalb dieser Gruppe sowie eine [c]activeCount()[/c]-Methode - (recommended for informational purposes only!), die 0 zurück gibt, wenn der letzte Thread der Gruppe beendet wurde.
 

Sophie

Bekanntes Mitglied
Hallo Spacerat

Ich weiss nicht so ganz, wie Du meinst, dass man diese ThreadGroup verwenden könnte.
Ich muss ja vorher festlegen welche Threads in diese Group kommen und ich weiss ja noch nicht, welcher Thread als letztes aus der for-Schleife rausgeht. Einen Thread brauche ich ja noch um mir die Matrix ausgeben zu lassen.
 

hdi

Top Contributor
Das Problem ist aber, das jeder Thread einmal über die Methode geht und ausgibt. Es sollte aber nur einmal sein. Ist es irgendwie möglich, dass zum Beispiel nur der erste oder der letzte Thread der dort ankommt ausgibt?

Ja das ist möglich, und du brauchst auch keine ThreadGroup o.ä. dafür. Lass deinen Code so wie ursprünglich gepostet und leg einfach eine (natürlich statische!) Zählvariable in deiner Klasse an, die jeder Thread am Ende seiner run-Methode inkrementiert. Das printMatrix() dann in ein entsprechendes if-Statement hinter das Inkrement packen. Du kannst dir dann aussuchen ob das der erste, der letzte, oder sonst irgendein Thread tun soll.

Achtung: Der Zugriff auf die Zählvariable muss jeweils synchronisiert sein, sonst drohen Race Conditions (genauer: Lost Updates, was dazu führen kann dass am Ende gar nix ausgegeben wird). Wenn du's nicht hinkriegst sag Bescheid. Sind nur 4 Zeilen...
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Richtig sollte es so aussehen
Java:
for (int i = 0; i < arrA.length; i++) {
	for (int j = 0; j < arrB[0].length; j++) {
		for (int k = 0; k < arrA[0].length; k++) {
			C[i][j] += arrA[i][k] * arrB[k][j];				
		}
	}
}
So würde man vorgehen, um die Ergebnismatrix komplett in einem Thread zu berechnen. Jetzt musst Du nur noch die Berechnung der einzelnen Zeilen (die werden ja mit den inneren zwei Schleifen berechnet) herauslösen und auf verschiedene Threads verteilen...
 
S

Spacerat

Gast
Also die resultierende Matrix ist ja wie es scheint in jedem Thread die selbe. Von daher würde ich dieses [c]printMatrix()[/c] schon mal von ausserhalb der Thread-Run-Methode aufrufen und zwar erst dann, wenn alle Threads mit ihren Berechnungen fertig sind. Deswegen dachte ich da an ThreadGroup - Thread instanzieren, der Gruppe hinzufügen, Thread starten, auf [c]activeCount() == 0[/c] warten und von ausserhalb [c]printMatrix()[/c] aufrufen. Diese [c]activeCount()[/c]-Methode ist prinzipell das, was hdi dir mit dieser Zählvariable vorgeschlagen hat aber eigentlich halt nur für rein informative Lösungen - so steht's in der API.
Das Ganze geht aber auch immer noch mit [c]java.util.concurrent[/c] viel sauberer und einfacher.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
E Richtiges Warten Java Basics - Anfänger-Themen 8
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
G Wie kann ich 1s lang warten? Java Basics - Anfänger-Themen 1
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
A Thread auf anderen warten Java Basics - Anfänger-Themen 2
C Warten auf Antwort Java Basics - Anfänger-Themen 22
S Threads Programm terminiert statt zu warten Java Basics - Anfänger-Themen 20
E ExecutorService warten bis alles fertig? Java Basics - Anfänger-Themen 5
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Input/Output Auf Tasteneingabe warten Java Basics - Anfänger-Themen 4
A Activity1 soll auf Activity2 warten (Camera-Intent) Java Basics - Anfänger-Themen 5
D Threads Kartenspiel - auf legen warten Java Basics - Anfänger-Themen 15
B Methode warten lassen bis Button gedrückt wird Java Basics - Anfänger-Themen 16
JAVAnnik auf Threadende warten Java Basics - Anfänger-Themen 6
H Auf Threads warten Java Basics - Anfänger-Themen 3
I Auf DB-Operation warten Java Basics - Anfänger-Themen 2
R Thread soll auf andere Threads warten Java Basics - Anfänger-Themen 3
T Warteschlange warten lassen bis Ereignis Java Basics - Anfänger-Themen 27
A Main warten lassen bis Variable durch Button übergeben wird Java Basics - Anfänger-Themen 2
V Warten bis die Länge eines Strings nicht mehr 0 ist Java Basics - Anfänger-Themen 13
M prozess starten und warten bis dieser sich beendet Java Basics - Anfänger-Themen 3
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
D Auf Event warten Java Basics - Anfänger-Themen 4
F Logikproblem: Auf Mouselistener warten Java Basics - Anfänger-Themen 6
E Auf Mouselistener warten?! Java Basics - Anfänger-Themen 20
M Warten bis Thread an einem Semaphore angekommen ist Java Basics - Anfänger-Themen 4
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
S Auf andere Methode warten Java Basics - Anfänger-Themen 7
B Während Schleife nicht auf Eingabe warten Java Basics - Anfänger-Themen 2
T auf vbscript warten Java Basics - Anfänger-Themen 3
S Thread warten abbrechen? Java Basics - Anfänger-Themen 5
C auf beendigung eines threads warten Java Basics - Anfänger-Themen 6
P Warten auf KeyTyped Java Basics - Anfänger-Themen 7
M warten in einer while-schleife Java Basics - Anfänger-Themen 12
L programm zum warten zwingen Java Basics - Anfänger-Themen 4
B Auf Programm warten Java Basics - Anfänger-Themen 2
S Auf Object warten Java Basics - Anfänger-Themen 2
K Auf File- Befehl warten. Java Basics - Anfänger-Themen 10
T eine Sekunde warten Java Basics - Anfänger-Themen 11
C Konsolenanwendung auf belibige Taste warten Java Basics - Anfänger-Themen 2
D Auf anderes Fenster Warten Java Basics - Anfänger-Themen 6
A Warten auf Userinput Java Basics - Anfänger-Themen 2
G Bei JDialog warten Java Basics - Anfänger-Themen 5
T Auf Selection warten Java Basics - Anfänger-Themen 7
N Java Insel 6 lesen oder auf 7 warten ? Java Basics - Anfänger-Themen 11
S Programmablauf pausieren, bzw. auf Eingabe warten Java Basics - Anfänger-Themen 4
G Warten auf Eingabe Java Basics - Anfänger-Themen 12
G Thread soll warten Java Basics - Anfänger-Themen 5
F 1 Minute warten Java Basics - Anfänger-Themen 18
S Thread auf Thread warten lassen. Java Basics - Anfänger-Themen 2
G auf ende mehrerer threads warten Java Basics - Anfänger-Themen 2
B Timer / Thread warten Java Basics - Anfänger-Themen 3
G warten Java Basics - Anfänger-Themen 10
P Warten-Fenster Java Basics - Anfänger-Themen 8
vogella *Gelöst *Im Programm warten (wait()) Java Basics - Anfänger-Themen 2
A Bitte Warten Java Basics - Anfänger-Themen 2
P Externen Proceß starten und warten bis beendet? Java Basics - Anfänger-Themen 2
J Threads: warten bis erste aktion ausgeführt wurde Java Basics - Anfänger-Themen 6
G Eine Methode zum Warten? Java Basics - Anfänger-Themen 7
G Frage zum Warten auf und Aufwecken von Threads Java Basics - Anfänger-Themen 2
L Einfaches Warten in eine Schleife Java Basics - Anfänger-Themen 9
B auf mehrere Threads warten Java Basics - Anfänger-Themen 3
K Animation warten lassen Java Basics - Anfänger-Themen 9
S Auf JInternalFrame warten? Java Basics - Anfänger-Themen 2
R Warten, bis ein Prozess gestartet wurde Java Basics - Anfänger-Themen 23
M x Sekunden warten Java Basics - Anfänger-Themen 13
P Bitte um ein paar Tipps! (Threads, Warten auf Ereignisse,.) Java Basics - Anfänger-Themen 2
M Wie lässt man eine Methode warten ohne Threads zu benutzen? Java Basics - Anfänger-Themen 8
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
missy72 Methoden Alle rekusiven Aufrufe abbrechen Java Basics - Anfänger-Themen 21
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
B Alle Zahlen finden, die 3 bestimmte Ziffern enthalten? Java Basics - Anfänger-Themen 9
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
E Select nimmt nicht alle Where /AND befehlen an Java Basics - Anfänger-Themen 4
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
R Methoden Eclipse schlägt mir nicht alle Möglichkeiten vor Java Basics - Anfänger-Themen 4
melisax Alle Möglichkeiten eines Wortes angeben Java Basics - Anfänger-Themen 3
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
J Alle Dateien aus einem Verzeichnis laden Java Basics - Anfänger-Themen 10
Bademeister007 Operatoren Alle Zahlen einer ArrayList die durch 5 teilbar ist Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
crrnogorka Letzte Zeile einer Tabelle "überschreibt" alle anderen Zeilen Java Basics - Anfänger-Themen 1
C alle möglichen Kombinationen zweier Ziffern auf drei / vier / und 'n" Stellen Java Basics - Anfänger-Themen 11
H Alle Geraden zahlen bis 10 ausgeben Java Basics - Anfänger-Themen 11
L Alle Ziele in einem Raster abknallen Java Basics - Anfänger-Themen 17
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
K Array alle Werte aufsummieren und ausgeben Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben