Matrixen berechnen nach Worker Master Paradigma mit Threads

K

kilobyte12

Mitglied
Hallo Zusamman,

ich sitze seit 3 Wochen an folgenden Aufgabe, die ich versuche zu lösen. Ich habe richtig gehabt allerdings aber laufen die Threads nicht sycron. Man nehme Ärger und Frost mit und das Ergebnis ist einfach, dass ich nicht weiterkomme.
Das wäre ganz, wenn ihr mir einen Rat geben könntet, wie ich das Programm hinkriege.

Man hat 2 = 5*5 Dimensionalen Matrizen. Es ergäben sich dann 25 Aufgaben. Angenommen wir erzeugen 25 Threads dann soll jeder Thread eine Aufgabe erledigen.
Wenn man 5 Threads erzeugt, dann sollte jeder Thread 5 Aufgaben erledigen. Nennt sich Resultatsparadigma.

Nun komme ich zu meinem Code.
Also ich habe Zwei Ansätze, ich zeigs mal erstmal mein ersten Ansatz.

Hier habe ich einfach Koordinaten von einem Matrizen als Klasse.
Java:
package aufgabe2Resultatparadigma;


public class Matrix {

public int zeile;
public int spalte;

    public Matrix(int zeile, int spalte) {
        this.spalte = spalte;
        this.zeile = zeile;
    }

  
    public int getZeile() {
        return zeile;
    }


    public void setZeile(int zeile) {
        this.zeile = zeile;
    }


    public int getSpalte() {
        return spalte;
    }


    public void setSpalte(int spalte) {
        this.spalte = spalte;
    }


    @Override
    public String toString() {
        return "Matrix [zeile=" + zeile + ", spalte=" + spalte + "]";
    }
  
}

Eine Queue, die Matrizenpunkte enthält. Die wird initialiesiert.
Java:
package aufgabe2Resultatparadigma;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;



public class MatrixList implements Iterable<Matrix>{
  
Queue<Matrix> qM = new LinkedList<>();

public MatrixList() {
    this.init();
}

public void init() {
    for(int i = 0; i < 5;i++) {
        for(int j = 0; j < 5;j++) {
            this.qM.add(new Matrix(i, j));
            }
        }
    }

public boolean isempty(){
    return qM.isEmpty();
}

public synchronized Matrix getfirstMatrix(){
  
    return qM.poll();
  
}

@Override
public Iterator<Matrix> iterator() {
    // TODO Auto-generated method stub
    return qM.iterator();
}

}

Die Worker Klasse..
Java:
package aufgabe2Resultatparadigma;

import java.util.ArrayList;

class Slave extends Thread {

    int[][] matrixA, matrixB, matrixC;
    public ArrayList<Matrix> mlist;
    public int counter = 0;  
  
    public Slave(int[][] matrixA, int[][] matrixB,int[][] matrixC,ArrayList<Matrix> mlist) {
        this.matrixA = matrixA;
        this.matrixB = matrixB;
        this.matrixC = matrixC;
        this.mlist = mlist;
    }

    public void run() {
        MatrixBerechnung();
    }
  
    public synchronized void MatrixBerechnung(){
        for (Matrix k : mlist) {        //Iteriert über die Koordinatenliste.
            int a = k.getZeile();
            int b = k.getSpalte();

            for (int j = 0; j < 5; j++) {
                matrixC[a][b] += matrixA[a][j] * matrixB[j][b];
            }
            counter++;
        //    System.out.print(Thread.currentThread().getName()+" berechnet: ");
        //    System.out.println(matrixC[a][b]);
        }
    }
    public synchronized void MatrixAusgabe() {
        for(int i = 0; i < matrixC.length;i++) {
            for(int j = 0; j < matrixC.length;j++) {
                System.out.print(matrixC[i][j]+" ");
               if(j == matrixC.length-1) {
                    System.out.println();
                }
            }
        }
    }
    public int getAnzahlArbeit() {
        return counter;
    }
}

Nun komme ich zu Masterklasse bei der es das Problem gibt.
Java:
package aufgabe2Resultatparadigma;

import java.util.ArrayList;


public class Master {
    public int slaveCount = 5;
    public MatrixList res = new MatrixList();
    public Slave[] slaves = new Slave[slaveCount];
  
    public void run() throws InterruptedException {
      
        int[][] matrixA = {{1,-2,3,4,-1},{-2,3,0,1,2},{4,-1,2,1,-2},{-2,1,3,-1,3},{0,2,-1,2,4}};
        int[][] matrixB = {{2,-4,-1,1,-2},{-1,1,-2,2,1},{5,0,3,-2,-4},{1,-2,1,0,2},{2,3,-3,0,0}};

        int[][] matrixC = new int[5][5];
      

        MatrixList mlist = new MatrixList();

        //slaves setzen
        int z1 = 25 % slaveCount;    //Variable um die restlichen(ungeraden) Koordinaten zuweisen zu können
        int z2 = 25 - z1;    //Variable um die "geraden" Koordinaten zuweisen zu können
        int z3 = 0;            //Zähler für restliche Koordinaten

        ArrayList<Matrix> aKor1 = new ArrayList<Matrix>();
        for (int j = 0; j < slaveCount; j++) {

            if (z3 < z1) {    //solange es restliche Koordinaten gibt...
                z3++;        //Die ersten Threads arbeiten immer 1x mehr damit die Rechnung bei ungeraden Threads aufgehen kann
                aKor1.add(mlist.getfirstMatrix());
            }
              
          
            for (int i = 0; i < (z2 / slaveCount); i++) {  //zuweisung der geraden Koordinaten
                aKor1.add(mlist.getfirstMatrix());

            }

            slaves[j] = new Slave(matrixA, matrixB, matrixC, aKor1);
          
            aKor1.clear(); //Clear für nächsten Thread
        }
        for (int i = 0; i < slaveCount; i++) {
            slaves[i].start();
        }
        for (int i = 0; i < slaveCount; i++) {
            slaves[i].join();
        }
        for (int p = 0; p < slaveCount; p++) {
            System.out.println(
                    "Ich bin " + slaves[p].getName() + " hat " + slaves[p].getAnzahlArbeit() + " mal berechnet");
        }
      
        slaves[0].MatrixAusgabe();
    }
}

Wie man bei Master sieht, habe ich 5 Threads erzeugt. Die Ausgabe sollte so aussehen:
Ich bin Thread-0 hat 5 mal berechnet
Ich bin Thread-1 hat 5 mal berechnet
Ich bin Thread-2 hat 5 mal berechnet
Ich bin Thread-3 hat 5 mal berechnet
Ich bin Thread-4 hat 5 mal berechnet
21 -17 19 -9 -8
-2 15 -9 4 9
16 -25 11 -2 -15
15 20 -1 -6 -9
3 10 -17 6 10

Die Ausgabe sieht aber folgendeermaßer aus:
Ich bin Thread-0 hat 0 mal berechnet
Ich bin Thread-1 hat 0 mal berechnet
Ich bin Thread-2 hat 0 mal berechnet
Ich bin Thread-3 hat 0 mal berechnet
Ich bin Thread-4 hat 0 mal berechnet
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
Warum ich lauter Nullen habe weiß ich, ist wegen dem clear() sieh bei Masterklasse =>akor1.clear();.
Wie kann ich das Problem lösen. Was stimmt nicht? :/ Komme wirklich nicht weiter. Wäre sehr heilig, wenn jemand mir helfen würde.

Hinweis:
Ich habe in google nichts zu Resultatsparadigma gefunden. Es gibt nicht darüber. Über Worker-Master gibt es zicht von Einträgen.
 
Zuletzt bearbeitet:
truesoul

truesoul

Top Contributor
Hallo.

Diese Zeile in Master
Code:
aKor1.clear();
sorgt dafür das du im Slave eine Leere ArrayList<Matrix> hat.

Pack einfach
Java:
ArrayList<Matrix> aKor1 = new ArrayList<Matrix>();
in die Schleife und entferne
Code:
aKor1.clear();
 
K

kilobyte12

Mitglied
Hey,
danke. Ich habs jetzt hingekriegt. sowas von überflüssig.
Also hier die richtige Lösung:
Java:
        for (int j = 0; j < slaveCount; j++) {
            ArrayList<Matrix> aKor1 = new ArrayList<Matrix>();//Liste in jeder Schleife anlegen
            aKor1.clear();//die bereits angelegte Liste zuvor löschen...
            if (z3 < z1) {    //solange es restliche Koordinaten gibt...
                z3++;        //Die ersten Threads arbeiten immer 1x mehr damit die Rechnung bei ungeraden Threads aufgehen kann
                aKor1.add(mlist.getfirstMatrix());
            }
               
            for (int i = 0; i < (z2 / slaveCount); i++) {  //zuweisung der geraden Koordinaten
                aKor1.add(mlist.getfirstMatrix());
               
            }   
            slaves[j] = new Slave(matrixA, matrixB, matrixC, aKor1);
        }

:mad::mad::mad::mad::mad::mad: Ich habs vergessen gehabt die Liste anzulegen wieder sonst hätte ich es wirklich hingekriegt.
Danke dir.

Gruß
Kilobyte
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Quadratwurzel berechnen Java Basics - Anfänger-Themen 8
V Wachstum berechnen und in Ist-Formel verwenden Java Basics - Anfänger-Themen 5
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Abschreibungsplan berechnen Java Basics - Anfänger-Themen 23
V Gehalt berechnen in Java Java Basics - Anfänger-Themen 6
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
J Array Speicherplatz berechnen Java Basics - Anfänger-Themen 35
H Eingabedaten berechnen Java Basics - Anfänger-Themen 9
B Tranportkosten berechnen mit unterschiedlichen MwSt Java Basics - Anfänger-Themen 9
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
N Ein Datum berechnen Java Basics - Anfänger-Themen 3
T Sparplan berechnen Java Basics - Anfänger-Themen 4
F Abstand zum Durchschnitt von 5 Zahlen berechnen... Java Basics - Anfänger-Themen 16
B java.util.Date berechnen Java Basics - Anfänger-Themen 11
P Mittelwert Arrayelemente berechnen Fehler Java Basics - Anfänger-Themen 5
UnknownInnocent Best Practice Schussparabel berechnen Java Basics - Anfänger-Themen 3
T Modulo / Pow berechnen Java Basics - Anfänger-Themen 4
E Statistische Kennzahlen berechnen Java Basics - Anfänger-Themen 2
F Switch Case Modulo berechnen Java Basics - Anfänger-Themen 12
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
C Preis berechnen mit Java Java Basics - Anfänger-Themen 4
B Zahl in String abspeichern und später berechnen Java Basics - Anfänger-Themen 15
N Best Practice Image recognition fuzzy Superhash berechnen Java Basics - Anfänger-Themen 1
Dawinartor Erste Schritte Schaltjahr berechnen Java Basics - Anfänger-Themen 1
L Pi berechnen Java Basics - Anfänger-Themen 1
UnknownInnocent Term (als String) berechnen und ausgeben Java Basics - Anfänger-Themen 10
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
J Variablen arithmetischen Mittelwert berechnen Java Basics - Anfänger-Themen 5
R Winkel berechnen bzw. Geraden sortieren Java Basics - Anfänger-Themen 33
I Schnittpunkt zweier Geraden berechnen Java Basics - Anfänger-Themen 25
M Erste Schritte Mittelwert berechnen -> Methode in der Methode? Java Basics - Anfänger-Themen 14
S Compiler-Fehler Schaltjahr berechnen Java Basics - Anfänger-Themen 5
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
S Durchschnitt berechnen aus zwei Textfeldern Java Basics - Anfänger-Themen 21
D Summe berechnen mit verändertem Wert aus Schleife Java Basics - Anfänger-Themen 1
R Liga Berechnen Java Basics - Anfänger-Themen 1
P Klassen Berechnen mehrerer Map-Werte Java Basics - Anfänger-Themen 13
R Fussballtabellen berechnen Java Basics - Anfänger-Themen 12
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
J Durchschnitt jeder Zeile und und Spalte in einem 2D Arrays berechnen Java Basics - Anfänger-Themen 6
F ISBN Prüfziffer berechnen Java Basics - Anfänger-Themen 17
F Die Teilersumme einer Eingabe berechnen Java Basics - Anfänger-Themen 11
S Negafibonacci Folge berechnen Java Basics - Anfänger-Themen 24
G Array Mittelwert berechnen, wie? Java Basics - Anfänger-Themen 8
S Primzahlen berechnen funktioniert nicht richtig Java Basics - Anfänger-Themen 1
N Mit LocalDate alter berechnen Java Basics - Anfänger-Themen 3
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2
N Arrays mit Zufallzahlen füllen und Statistiken berechnen Java Basics - Anfänger-Themen 5
A Wochentag berechnen Java Basics - Anfänger-Themen 10
Ste3et_C0st Vectoren berechnen Java Basics - Anfänger-Themen 8
L Durchschnitt in der Schleife berechnen Java Basics - Anfänger-Themen 11
A Kreisumfang/-Fläche vom Kreis berechnen Java Basics - Anfänger-Themen 39
L Wochentag berechnen Java Basics - Anfänger-Themen 5
L Rekursive Methode a * b berechnen Java Basics - Anfänger-Themen 2
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ausdrücke berechnen Java Basics - Anfänger-Themen 2
V Mittelwert berechnen Java Basics - Anfänger-Themen 31
H Datentypen Tage zwischen zwei Datums berechnen Java Basics - Anfänger-Themen 4
P Quadrate berechnen Java Basics - Anfänger-Themen 3
S OOP Datumsunterschied in Tagen berechnen Java Basics - Anfänger-Themen 3
M Methoden Aus Timestamp das Datum berechnen Java Basics - Anfänger-Themen 3
B Schaltjahre berechnen! Java Basics - Anfänger-Themen 1
A werte in einem String berechnen Java Basics - Anfänger-Themen 3
F Checksummen aus int-Array berechnen Java Basics - Anfänger-Themen 3
F Toto-Tipp-Reihen berechnen Java Basics - Anfänger-Themen 1
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
R Quersumme berechnen - Methodenproblem Java Basics - Anfänger-Themen 1
S Button "Berechnen" geht nicht Java Basics - Anfänger-Themen 3
M Fakultät berechnen Java Basics - Anfänger-Themen 2
R Palindrom eines int-Arrays berechnen Java Basics - Anfänger-Themen 14
N Zeit berechnen, die für eine Strecke benötigt wird Java Basics - Anfänger-Themen 3
hello_autumn Maximum berechnen. Java Basics - Anfänger-Themen 17
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
H pi näherungsweise berechnen - Wallis Produkt Java Basics - Anfänger-Themen 9
E Eulersche Zahl berechnen, Endlosschleife Java Basics - Anfänger-Themen 2
D Folgestände berechnen Java Basics - Anfänger-Themen 6
I Höchste Zahl berechnen die eine Eingabe ohne Rest teilt und eine Primzahl ist Java Basics - Anfänger-Themen 2
B Restzeit berechnen (Kopiervorgang) Java Basics - Anfänger-Themen 7
S Kleines Zeichen berechnen Java Basics - Anfänger-Themen 5
F Datum Differenz berechnen Java Basics - Anfänger-Themen 7
J Erste Schritte Zeitstempeldifferenz berechnen Java Basics - Anfänger-Themen 2
A Hashwert einer Datei berechnen Java Basics - Anfänger-Themen 3
K Notendurschnitt berechnen Java Basics - Anfänger-Themen 9
T String "2+4*3" berechnen lassen? Java Basics - Anfänger-Themen 13
F EUI-64 von IPv6 berechnen (local link) Java Basics - Anfänger-Themen 2
J Fibonacci Zahlen berechnen Java Basics - Anfänger-Themen 3
M Alle Sublisten einer bestimmten Laenge berechnen Java Basics - Anfänger-Themen 2
S Erste Schritte Tage zwischen 2 Daten berechnen Java Basics - Anfänger-Themen 6
J Pi berechnen Java Basics - Anfänger-Themen 2
Z Zahl Pi probabilistisch berechnen (Kritik/Verbesserungsvorschläge) Java Basics - Anfänger-Themen 4
Z Differenz zwischen 2 Daten berechnen, ohne importiere Funktionen! Java Basics - Anfänger-Themen 10
A Datum zwischen zwei Daten berechnen und in Tagen anzeigen Java Basics - Anfänger-Themen 4
X Sinusreihe berechnen Java Basics - Anfänger-Themen 24
E Zeit zum bestimmten Datum in millisekunden berechnen Java Basics - Anfänger-Themen 5
V Benutzerdefinierter Zahlenbereich berechnen Java Basics - Anfänger-Themen 5
T Flächeninhalt von Papierformaten berechnen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Anzeige

Neue Themen


Oben