Vorlesung Verteilte Systeme Übungsblatt 2
Aufgabe 1:
Beschreiben Sie (z.B. mit Pseudocode) die zwei grundsätzlichen Möglichkeiten, wie man in Java Threads erzeugt.
Aufgabe 2:
Welche der folgenden Aussagen sind wahr oder falsch?
a) Der schreibende Zugriff auf Objektattribute einer Klasse von verschiedenen Threads aus ist immer unkritisch.
b) Der schreibende Zugriff auf lokale Variablen einer Klassenmethode von verschiedenen Threads aus ist immer unkritisch.
c) Der schreibende Zugriff auf Klassenattribute (static-Attribute einer Klasse) von verschiedenen Threads aus ist immer kritisch.
d) Wenn ein Thread in einem wait() auf etwas wartet, kann dieser Wartezustand nicht durch Schicken eines „Interrupts“ (per Aufruf der interrupt()-Methode) unterbrochen werden.
e) Der Aufruf von notify() auf einem Datenobjekt, an dem Threads warten, weckt alle wartenden Threads auf.
f) Wenn nur ein Thread schreibend auf eine Resource zugreift und die anderen nur lesen, dann muss der Zugriff nicht synchronisiert werden.
g) Der Aufruf der Methode interrupt() auf einem Threadobjekt wirft eine InterruptedException, wenn dieser Thread auf etwas wartet (z.B. in einem wait()- Aufruf).
h) Der Aufruf der Methode interrupt() auf einem Threadobjekt wirft auch dann eine Interrupted-Exception, wenn der Thread nicht auf etwas wartet.
i) Wenn zwei Threads nacheinander auf verschiedene Objekte als gemeinsame Ressourcen schreibend zugreifen, dann sollten die Objekte von beiden Threads immer in der gleichen Reihenfolge gesperrt werden, um Deadlocks zu vermeiden.
j) Eine Java-Klasse hat zwei mit synchronized verriegelte Methoden m1() und m2(). Man sollte nie Methode m1() in der Methode m2() oder umgekehrt aufrufen, sonst erhält man einen Deadlock.
Aufgabe 3:
Warum sollte man in Java und auch in anderen Sprachen einen Thread nie durch Aufruf einer Art stop()-Methode von einem anderen Thread aus unmittelbar beenden können, bzw.
warum ist diese Methode in Java „deprecated“. Wie sollte man dann Threads beenden?
Aufgabe 4: (Programmieraufgabe)
Erläutern Sie am Beispiel (z.B. das Threadbeispiel aus der Vorlesung), was Nichtdeterminismus einer Verteilten Anwendung ist.
Aufgabe 5: (Programmieraufgabe)
Schreiben Sie den Serverteil der Wetteranwendung so um, dass er einen Threadpool von Threads zur Verarbeitung der empfangenen Datenpakete auf der Serverseite verwendet.
Verwenden sie hierfür den ExecutorService des java.util.concurrent-Paketes.