Ein Problem aus einer langsam aussterbenden Welt: Wir betrachten ein System mit drei Rauchern ("smoker") und einem Agenten. Jeder Raucher rollt sich so oft wie möglich eine Zigarette und raucht diese anschlieflend. Um eine Zigarette rollen und rauchen zu können benötigt ein Raucher drei Zutaten: Tabak ("tobacco"), Papier ("paper") und Streichhölzer ("matches"). Einer der drei Raucher hat Tabak, ein anderer Papier und der Dritte hat Streich- hölzer. Der Agent hat eine unendliche Menge von allen drei Dingen. Alle sitzen um einen Tisch versammelt. Das Verhalten in diesem System ist folgendermaflen: 1. Der Agent legt zwei der drei Zutaten auf den Tisch (zuf‰llig ausgew‰hlt). 2. Der Raucher, der die fehlende dritte Zutat besitzt, nimmt die beiden Zutaten vom Tisch, rollt sich eine Zigarette und raucht sie anschlieflend (das kostet Zeit!). Wenn er mit dem Rauchen fertig ist, signalisiert er dies dem Agenten. 3. Der Agent beginnt wieder einen neuen Zyklus --> Schritt 1. 2.1. Schreiben Sie ein JAVA-Programm, welches das o.g. Systemverhalten mit einem Agenten-Thread und drei Smoker-Threads simuliert! Benutzen Sie die JAVA- Synchronisationsmechanismen (Eintritt in einen Objekt-Monitor mittels "synchronize") und die Methoden zur Threadsynchronisation (wait(), notify(), notifyAll()). Die Si- mulation soll nach einer vorgegebenen Zeit durch den Aufruf der Methode interrupt() beendet werden. 2.2. Testen Sie ihr Programm und dokumentieren Sie die erfolgreiche Simulation durch ge- eignete Testausgaben!