Zunächst möchte ich mich für die Quasi-Wiederholung der letzten Aufgabe entschuldigen. Da habe ich wohl mal kurzfrsitig den Überblick verloren. Daher schreibe ich gleich eine neue Aufgabe heute hinterher.

In meiner Zwölften stehe ich im Moment an der Stelle, dass ich meinen Schülern die Programmierung mit Threads näherbringen muss. Rahmenthema sind Semaphoren, Monitoring, Deadlocks etc. Um diese Problematik zu verstehen, versuche ich also Threads programmieren zu lassen. Dabei taucht sehr schnell das Problem auf, das so einfache Sachen wie start() und stop() depricated sind und sich nicht so einfach umgehen lassen.

Nun habe ich bei meiner letzten Unterrichtstunde eine Analogie gefunden, die den Schülern sehr eingängig war und die Lösungsidee schön verdeutlichte. Meine Idee basiert dabei auf folgendem youtube-Film:

Der Hund implementiert dabei das Interface „swallowable“ – er kann also theoretisch schlucken. Allerdings nicht ohne Hilfe des Stuhls. Wenn dem Hund das start()-Kommando gegeben wird, dann setzt er sich selbstständig in den Stuhl und kann dann auch schlucken. Ist der fertig und bekommt das stop()-Kommando, so geht er selbstständig wieder aus dem Stuhl.

So ähnlich ist das auch mit der Implementierung von Threads:Das Baby links ist Runnable, also lauffähig. Es hat zwar Beine, aber kann ohne Hilfe nicht laufen. Wenn ich dem Baby jetzt das start()-Kommando geben, krabbelt es in die Laufhilfe (Thread) und kann dann auch laufen. Kommt das Stop()-Kommando, so klettert es wieder heraus.

Im Quellcode sieht das Ganze dann so aus:

import javax.swing.*;

public class Baby implements Runnable{
    Thread thread = null;

    public synchronized void start(){
        if (thread == null){           //Ist noch nicht in der Laufhilfe
            thread = new Thread(this); //Laufhilfe anziehen
            thread.start();            //loslaufen
        }
    }

    public synchronized void stop() {
        if (thread != null) {          //Hat Laufhilfe noch dran
            thread = null;             //Aus der Laufhilfe krabbeln
        }
    }

    public void run(){
        //Was immer auch beim laufen gemacht werden soll
    } 
}

Das Beispiel war immerhin so plakativ, dass die Schüler sich die grundlegende Idee merken konnten und dann beim Programmieren des anschließenden Chat-Servers auch wiederverwenden konnten. Die erste Aufgabe war allerdings in diesem Zusammenhang eine deutlich einfacher:

Aufgabe

Programmiere einen einarmigen Banditen in dem Sinne, dass drei Spielwalzen durch Klick auf die Schaltfläche so angehalten werden sollen, dass man möglichst dreimal die gleiche Zahl hat.