pp.02.02-ThreadLocal
Threadlokaler Speicher
- Projekt:
pp.02.02-ThreadLocal
- Bearbeitungszeit: 15 Minuten
- Musterlösung: 15 Minuten
- Kompatibilität: mindestens Java SE 10
Random
hat eine Konstruktorvariante, die ein long
als Parameter erwartet. Diese Zahl wird als Seed benutzt, um den Zufallszahlengenerator mit einem Startwert zu konfigurieren. Alle Instanzen von Random
, die mit demselben Wert n
als Seed konfiguriert wurden, liefern dieselbe Sequenz von Zufallszahlen. Das ist beispielsweise beim Testen sehr hilfreich.
In dieser Übungsaufgabe wird das benutzt, um unterschiedliche Instanzen von Random
zu identifizieren und zu unterscheiden: In dem Programm in MyThreadLocalRandom
werden 10 Threads gestartet. In jedem Thread werden jeweils 20 Zufallszahlen gezogen. Alle 20x10 Zufallszahlen werden vom selben Zufallszahlengenerator gezogen:
Sie kommen alle von derselben Random
-Instanz und es handelt sich deshalb um eine Sequenz von 200 unabhängigen Zufallszahlen.
static
Members wie now
werden initialisiert, wenn die umgebende Klasse in die JVM geladen wird. Instanzvariablen wie rand
werden jeweils initialisiert, wenn eine Instanz mit dem Konstruktor erzeugt wird.
Quellcode von MyThreadLocalRandom
import java.util.Random;
public class MyThreadLocalRandom implements Runnable {
public static long now = System.currentTimeMillis();
public Random rand = new Random(now);
@Override
public void run() {
var strBuf = new StringBuffer();
strBuf.append(Thread.currentThread().getName() + ": ");
for (var j = 0; j < 20; j++) {
strBuf.append(String.format("%2d ", this.rand.nextInt(100)));
}
System.out.println(strBuf);
}
public static void main(String... args) {
var runner = new MyThreadLocalRandom();
for (var i = 0; i < 10; i++) {
new Thread(runner, String.format("Runner-%02d", i)).start();
}
}
}
Aufgaben
- Ändern Sie
MyThreadLocalRandom
so, dass jeder Thread ein getrenntes Random-Objekt hat, das mitnow
als Seed konfiguriert wurde, damit jeweils in den 10 Threads dieselbe Sequenz von 20 Zufallszahlen gezogen wird.