Hi 
Ich hab leider scheinbar echt Probleme mit Threads. Scheinbar schaff ich noch nicht mal die einfachsten Sachen
Ich wollte mal ein wenig mit http://www.umiacs.umd.edu/users/vishkin/PUBLICATIONS/classnotes.pdf herumexperimentieren, aber scheiter leider gleich am Anfang beim ersten Algorithmus 1 (summation) auf Seite 10. Irgendwie ist das ziemlich frustrierend. Dabei dachte ich echt, ich hätte eine Möglichkeit gefunden:
Aber leider liefert mir das eine IllegalMonitorStateException. Ist also alles falsch, was ich gemacht habe. Total falsches Konzept. Jetzt weiß ich nicht mehr weiter. 
Wie macht man denn das richtig?
Ich hab leider scheinbar echt Probleme mit Threads. Scheinbar schaff ich noch nicht mal die einfachsten Sachen
Ich wollte mal ein wenig mit http://www.umiacs.umd.edu/users/vishkin/PUBLICATIONS/classnotes.pdf herumexperimentieren, aber scheiter leider gleich am Anfang beim ersten Algorithmus 1 (summation) auf Seite 10. Irgendwie ist das ziemlich frustrierend. Dabei dachte ich echt, ich hätte eine Möglichkeit gefunden:
Java:
class B
{
private int v; // Wert
private boolean valid = false; // ob B schon einen Wert hat
public void set(int v)
{
this.v = v;
valid = true;
notifyAll();
}
public int get(int h, int i)
{
while(!valid)
{
try
{
System.out.println("waiting h: " + h + ", i: " + i);
wait();
}
catch(InterruptedException e)
{
}
}
return v;
}
}
class T extends Thread
{
private int i;
private int[] a;
private B[][] b;
/**
* @param int i Thread-ID >= 0
* @param int[] a Daten
* @param B[][] b Summen
*/
public T(int i, int[] a, B[][] b)
{
this.i = i;
this.a = a;
this.b = b;
start();
}
public void run()
{
System.out.println("i: " + i);
int n = a.length; // Anzahl der Werte in a = 8
int logN = (int)(Math.log(n) / Math.log(2)); // log2(n), bei n = 8 => 3
b[0][i].set(a[i]); // unterste Reihe in der Baumstruktur (h = 0)
for(int h = 1; h <= logN; ++h) // Höhe. Bei n = 8 läuft jeder Thread von 0 bis 3.
{
if(i < n / Math.pow(2, h)) // Allerdings führt nich jeder Thread in jedem Durchlauf eine Addition durch.
{
int v =
b[h - 1][2 * i].get(h, i) +
b[h - 1][2 * i + 1].get(h, i);
b[h][i].set(v);
System.out.println("h: " + h + ", i: " + i + ", B[" + h + "][" + i + "] = B[" + (h - 1) + "][" + (2 * i) + "] + B[" + (h - 1) + "][" + (2 * i + 1) + "] = " + v);
}
}
}
}
class P0
{
public static void main(String[] args)
{
int[] a = {1, 2, 3, 4, 5, 6, 7, 8}; // Werte
int n = a.length; // Anzahl der Werte in a = 8
int logN = (int)(Math.log(n) / Math.log(2)); // log2(n), bei n = 8 => 3
B[][] b = new B[logN + 1][n]; // [0 ... 3][0 ... 7]
for(int i = 0; i < logN + 1; ++i)
{
for(int j = 0; j < n; ++j)
{
b[i][j] = new B();
}
}
// h
// 3 T0: B[3][0]
// / + \
// 2 T0: B[2][0] T1: B[2][1]
// / + \ / + \
// 1 T0: B[1][0] T1: B[1][1] T2: B[1][2] T3: B[1][3]
// / + \ / + \ / + \ / + \
// 0 T0: B[0][0]=A[0] T1: B[0][1]=A[1] T2: B[0][2]=A[2] T3: B[0][3]=A[3] T4: B[0][4]=A[4] T5: B[0][5]=A[5] T6: B[0][6]=A[6] T7: B[0][7]=A[7]
//
// Legende: Ti ... Thread i
System.out.println("n: " + n);
System.out.println("logN: " + logN);
T[] threads = new T[n];
for(int i = 0; i < n; ++i) // zu jedem Wert 1 Thread
{
threads[i] = new T(i, a, b);
}
// Ausgabe:
//System.out.println("Summe: " + b[logN][0].get());
}
}
Wie macht man denn das richtig?
Zuletzt bearbeitet: