Hallo,
ich habe ein recht komplexes Programm, bei dem ich einen kleinen Bereich mit mehreren Threads ausfuehren will.
Ich habe mal ein minimales Beispiel geschrieben, damit man ungefaehr sieht was ich nebenlaeufig ausfuehren will.
Ich hab den Bereich der durch mehrere Threads ausgefuehrt werden soll mit // mehrere Threads markiert. Im Beispiel werden zufaellig 1000 Quadrate erzeugt mit der Kantenlaenge 10. Die Position x,y der Quadrate ist zufaellig. Einige Quadrate ueberlappen und dies ist nicht erlaubt. Im Rechenschritt der parallelisiert werden soll, werden die Quadrate durchlaufen und geschaut ob sie mit einem Quadrat in der "output" Liste ueberlappen. Wenn ja, bekommt das Quadrat eine neue Position bis keinen Konflikt mehr gibt und es dann der "output" Liste hinzugefuegt wird.
ich habe ein recht komplexes Programm, bei dem ich einen kleinen Bereich mit mehreren Threads ausfuehren will.
Ich habe mal ein minimales Beispiel geschrieben, damit man ungefaehr sieht was ich nebenlaeufig ausfuehren will.
Ich hab den Bereich der durch mehrere Threads ausgefuehrt werden soll mit // mehrere Threads markiert. Im Beispiel werden zufaellig 1000 Quadrate erzeugt mit der Kantenlaenge 10. Die Position x,y der Quadrate ist zufaellig. Einige Quadrate ueberlappen und dies ist nicht erlaubt. Im Rechenschritt der parallelisiert werden soll, werden die Quadrate durchlaufen und geschaut ob sie mit einem Quadrat in der "output" Liste ueberlappen. Wenn ja, bekommt das Quadrat eine neue Position bis keinen Konflikt mehr gibt und es dann der "output" Liste hinzugefuegt wird.
Java:
public class MultiThreadedAccess {
public static void main(String[] args) {
int n = 1000;
Random ran = new Random();
int w = 10, h = w;
List<Rectangle> input = new ArrayList<Rectangle>(n);
for (int i = 0; i < n; i++) {
input.add(new Rectangle(ran.nextInt(n), ran.nextInt(n), w, h));
}
List<Rectangle> output = new ArrayList<Rectangle>(n);
// mehrere Threads
for (Rectangle r : input) {
expensiveCalc(r);
while (conflicts(r, output)) {
Point p = expensiveCalc(r);
r.setLocation(p.x, p.y);
}
output.add(r);
}
// mehrere Threads
}
private static boolean conflicts(Rectangle r, List<Rectangle> output) {
for (Rectangle fixed : output) {
if (r.intersects(fixed)) {
// System.out.println(r + " conflicts " + fixed);
return true;
}
}
return false;
}
}
Zuletzt bearbeitet: