Hallo,
ich experimentiere gerade ein wenig mit Threads. Hierzu gebe ich jedem Thread die Referenz eines Objektes mit. Innerhalb der Threads wird eine Berechnung durchgeführt. Ist das Ergebnis der einzelnen Berechnung besser, als das bisherige, dann speichere ich die "neu" Lösung in diesem Objekt. Über synchronized sollte, wenn ich es richtig verstanden habe, verhindert weden, dass zwei Threads gleichzeitig speichern - ist das korrekt so?
Da ich das Ende des am längsten laufenden Thread abwarten muss, rufe ich join bei allen Threads auf. Vereinfacht sieht das ganze wie folgt aus, wobei tasks eine Liste mit allen Threads ist.
Was mich nun wundert ist, dass wenn ich task.start(); durch task.run(); ersetze (und somit nicht mehr mehrere Thread gleichzeitig arbeiten) die Berechnung um ca. die Hälfte schneller ist. Sollte das nicht genau andersherum ablaufen?
Freue mich, wenn Ihr mir ein paar Tipps geben könntet.
Micha
ich experimentiere gerade ein wenig mit Threads. Hierzu gebe ich jedem Thread die Referenz eines Objektes mit. Innerhalb der Threads wird eine Berechnung durchgeführt. Ist das Ergebnis der einzelnen Berechnung besser, als das bisherige, dann speichere ich die "neu" Lösung in diesem Objekt. Über synchronized sollte, wenn ich es richtig verstanden habe, verhindert weden, dass zwei Threads gleichzeitig speichern - ist das korrekt so?
Java:
public class Result {
private double d = Double.MAX_VALUE;
private double par[];
public synchronized void setValues(double d, double par[]) {
if (d <= this.d) {
this.d = d;
this.par = par;
}
}
}
Da ich das Ende des am längsten laufenden Thread abwarten muss, rufe ich join bei allen Threads auf. Vereinfacht sieht das ganze wie folgt aus, wobei tasks eine Liste mit allen Threads ist.
Java:
for (Thread task : tasks) {
task.start();
}
for (Thread task : tasks) {
try {
task.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Was mich nun wundert ist, dass wenn ich task.start(); durch task.run(); ersetze (und somit nicht mehr mehrere Thread gleichzeitig arbeiten) die Berechnung um ca. die Hälfte schneller ist. Sollte das nicht genau andersherum ablaufen?
Freue mich, wenn Ihr mir ein paar Tipps geben könntet.
Micha