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:

public Random rand;

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 mit now als Seed konfiguriert wurde, damit jeweils in den 10 Threads dieselbe Sequenz von 20 Zufallszahlen gezogen wird.