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.
Eine Queue, die Matrizenpunkte enthält. Die wird initialiesiert.
Die Worker Klasse..
Nun komme ich zu Masterklasse bei der es das Problem gibt.
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.
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: