pp.01.02-Runnable

Start eines Threads als Runnable und Refactoring

  • Projekt: pp.01.02-Runnable
  • Bearbeitungszeit: 10 Minuten
  • Musterlösung: 10 Minuten
  • Kompatibilität: mindestens Java SE 19

Quellcode von pp.MyWorker

package pp;

class MyWorker implements Runnable {
  private Thread self;

  @Override
  public void run() {
    this.self = Thread.currentThread();
    while (true) {
      System.out.println(this.self.getName() + ": ID => " + this.self.threadId());
    }
  }
}

Quellcode von pp.MyWorkerCoop

package pp;

class MyWorkerCoop implements Runnable {
  private Thread self;

  @Override
  public void run() {
    this.self = Thread.currentThread();
    while (true) {
      System.out.println(this.self.getName() + ": ID => " + this.self.threadId());
      Thread.yield();
    }
  }
}

Quellcode von pp.Starter

package pp;

public class Starter {
    static int WORKERS = 200;

    public static void main(String... args) {
        for (var i = 0; i < Starter.WORKERS; i++) {
            var t = new Thread(new MyWorker(), String.format("Worker-%03d", i));
            t.start();
        }
    }
}

Aufgaben

  • Lassen Sie Starter laufen und analysieren Sie das Verhalten. Ändern Sie den Starter so, dass statt MyWorker Instanzen von MyWorkerCoop erzeugt werden.
  • Vergleichen Sie das Verhalten von beiden Varianten. Recherchieren Sie die API-Beschreibung von Thread.yield() und erklären Sie sich den Unterschied.
  • Erzeugen Sie eine Kopie der Klasse Starter namens StarterInner, die dieselbe Funktion hat wie Starter aber anstatt einer externen Klasse für den Worker eine anonyme innere Klasse verwendet.
  • Erzeugen Sie eine Kopie der Klasse Starter namens StarterLambda, die dieselbe Funktion hat wie Starter aber anstatt einer externen Klasse für den Worker einen Lambda-Ausdruck verwendet.