pp.07.02.Collections
Experimenteller Vergleich von Container-Varianten
- Projekt:
pp.07.02.Collections
- Bearbeitungszeit: 30 Minuten
- Musterlösung: 30 Minuten
- Kompatibilität: mindestens Java SE 10
Quellcode von pp.ExperimentVector
package pp;
import java.util.Vector;
class ExperimentVector {
Integer countA;
Integer countB;
Vector<Integer> list;
void work(int size) throws InterruptedException {
this.countA = 0;
this.countB = 0;
this.list = new Vector<>();
var t1 = new Thread(() -> {
for (var i = 0; i < size; i++) {
this.list.add(1);
}
});
var t2 = new Thread(() -> {
for (var i = 0; i < size; i++) {
this.list.add(1);
}
});
var t3 = new Thread(() -> {
for (var i = 0; i < (size * 2); i++) {
this.countA += this.list.get(i);
}
});
var t4 = new Thread(() -> {
for (var i = (size * 2) - 1; i >= 0; i--) {
this.countB += this.list.get(i);
}
});
var now = System.currentTimeMillis();
t1.start();
t2.start();
t1.join();
t2.join();
t3.start();
t4.start();
t3.join();
t4.join();
System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
(this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
System.currentTimeMillis() - now, "Vector");
}
}
Die Klasse ExperimentVector
stellt die Methode work
bereit. Sie bekommt als Parameter eine int
-Zahl, die die Größe der Aufgabe charakterisiert. In dieser Methode werden vier Threads erzeugt, die alle konkurrierend auf die Container-Datenstruktur list
zugreifen. Zwei greifen lesend darauf zu, zwei ändern sie, indem Elemente hinzugefügt werden. Der Container ist in dieser Klasse vom Typ Vector
.
Insgesamt wird die Laufzeit gemessen, die zur Abarbeitung der Aufgabe benötigt wird. Außerdem wird geprüft, ob ein erwarteter Wert erreicht wird, von dem man annehmen kann, dass er bei einer nicht threadsicheren Implementierung mit hoher Wahrscheinlichkeit eine fehlerhafte Größe haben wird.
Aufgaben
- Erstellen Sie ein Programm, mit dem Sie die Performanz unterschiedlicher Listeninplementierungen messen können.
- unabhängige Variablen: Größe der Aufgabe (z.B. Länge der Liste), Listenimplementierung
- abhängige Variable: Laufzeit
- Berücksichtigen Sie Threadsicherheit und verwenden Sie mindestens zwei Threads, die nebenläufig auf die Liste zugreifen. Sie können sich am Design von
work
in der vorgegebenen KlasseExperimentVector
orientieren. - Führen Sie Messungen der Laufzeit durch.
- Visualisieren Sie die Ergebnisse und analysiseren Sie das Ergebnis.