Hallo,
ich will Quicksort parallel implementieren, was auch ganz gut klappt. Das Problem ist, dass das Warten auf das sterben der Threads nicht klappt. Hier ist ein kleiner Codeausschnitt, der die Problematik verdeutlichen soll:
Der Code hat natürlich kein Anspruch auf Vollständigkeit. Außerdem weiß ich, dass er doppeltgemoppelt ist, doch ist habe es so und so probiert, damit es auf die Prozesse wartet. Habe nur das - in meinen Augen - Wichtigste gepostet. Der Output nach dem sortieren ist:
Das heißt, dass er nicht abwartet bis die Threads sterben, sondern die Sachen ausgibt, bevor alle Nebenprozesse fertig sind. Kann mir einer einen Tipp geben, wo mein Denkfehler liegt? Eig. sollten die join()'s doch immer den ganzen Algorithmus warten lassen...
Danke
ich will Quicksort parallel implementieren, was auch ganz gut klappt. Das Problem ist, dass das Warten auf das sterben der Threads nicht klappt. Hier ist ein kleiner Codeausschnitt, der die Problematik verdeutlichen soll:
Java:
public class ParaQSort implements Runnable {
public void run() {
Thread lsThread = new Thread(new PQSort(numbers,0, numbers.length - 1));
lsThread.start();
}
static class PQSort implements Runnable{
public void run() {
// Recursion
if (low < j){
lsThread = new Thread(new PQSort(numbers,low,j));
lsThread.start();
}
if (i < high){
rsThread = new Thread(new PQSort(numbers,i,high));
rsThread.start();
}
try { lsThread.join();
} catch (Exception e) { }
try { rsThread.join();
} catch (Exception e) {}
}
}
}
public class Tester {
public static void main(String[] args) {
try {
int[] testData = {2,4,3,1,5,6,3,2,7,344,3,1,2,23,34,4,5};
ParaQSort sorter = new ParaQSort(testData);
Thread starter = new Thread(sorter);
starter.start();
starter.join();
System.out.println(sorter);
System.out.println(Thread.activeCount());
while(Thread.activeCount()>1){
}
System.out.println(sorter);
System.out.println(Thread.activeCount());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Der Code hat natürlich kein Anspruch auf Vollständigkeit. Außerdem weiß ich, dass er doppeltgemoppelt ist, doch ist habe es so und so probiert, damit es auf die Prozesse wartet. Habe nur das - in meinen Augen - Wichtigste gepostet. Der Output nach dem sortieren ist:
Code:
[2,4,3,1,5,6,3,2,5,4,3,1,2,23,34,344,7]
6
[1,1,2,2,2,3,3,3,4,4,5,5,6,7,23,34,344]
1
Das heißt, dass er nicht abwartet bis die Threads sterben, sondern die Sachen ausgibt, bevor alle Nebenprozesse fertig sind. Kann mir einer einen Tipp geben, wo mein Denkfehler liegt? Eig. sollten die join()'s doch immer den ganzen Algorithmus warten lassen...
Danke