pp.06.01-SynchInterrupt
Unterbrechbarkeit von Threads, die blockiert sind
- Projekt:
pp.06.01-SynchInterrupt - Bearbeitungszeit: 25 Minuten
- Musterlösung: 15 Minuten
- Kompatibilität: mindestens Java SE 10
Quellcode von pp.Task
Task stellt einen Thread dar, der über die Methode kill abgebrochen werden kann, nachdem er gestartet wurde.
In der run-Methode befindet sich ein ca. 8.000 ms lang schlafender Abschnitt, der durch den Monitor Task.class geschützt ist. Wenn mehrere Instanzen von Task gestartet werden, werden deshalb alle bis auf einen nach Kurzem blockiert sein.
public class Task extends Thread {
private volatile boolean stop = false;
public Task(String name) {
setName(name);
}
public void kill() {
System.out.printf("%s: killing...\n", getName());
this.stop = true;
interrupt();
}
@Override
public void run() {
System.out.printf("%s: startup\n", getName());
while (!this.stop) {
try {
synchronized (Task.class) {
System.out.printf("%s: working\n", getName());
Thread.sleep(8000);
}
} catch (InterruptedException e) {
System.out.printf("%s: interrupted\n", getName());
}
}
System.out.printf("%s: finished\n", getName());
}
// ...
}In der main-Methode werden drei Instanzen von Task erzeugt und gestartet. Zuerst T1, dann nach 1.000 ms T2 und T3. Die beiden letzteren sind also aufgrund von synchronized blockiert. Sodann wird T2 (im Moment blockiert) über den Aufruf von kill abgebrochen.
Aufgaben
- Untersuchen Sie das Verhalten in Bezug auf die Unterbrechbarkeit von
Task(Lassen Sie das Programm laufen und interpretieren Sie dessen Ausgaben). - Bauen Sie die Klasse
Taskzur Verwendung vonReentrantLockum.
- Untersuchen Sie das Verhalten in Bezug auf die Unterbrechbarkeit erneut. Prüfen Sie den Effekt von
lockInterruptibly()im Vergleich zulock().