9.9 Kooperative und nichtkooperative Threads
Mit der Methode sleep() legen wir den aktuellen Thread für eine bestimmte Zeit auf Eis. Das ist für das darunter liegende Betriebssystem nur gut, denn wenn ein Thread die ganze Berechnungszeit für sich beansprucht, dann kann dies schon einmal zu Problemen führen. Dies hängt auch mit dem Betriebssystem und der Lastenverteilung zusammen. Die meisten modernen Betriebssysteme sind preemptiv (auch präemptiv), wenige noch kooperativ (Win 3.11, altes MacOS).
1. |
Ein kooperatives Betriebssystem verlangt vom Programmierer, dass dieser seine ablaufenden Programme so gestaltet, dass sie freiwillig nach einer gewissen Zeit die Kontrolle über den Prozessor abgeben. |
2. Preemptive Betriebssysteme entziehen einem Programm die Kontrolle über den Prozessor gegebenenfalls zwangsweise.
Unter Solaris und Windows kann sich die verzahnte Ausführung mehrerer Threads unterscheiden, da beide Betriebssysteme die Rechenzeit auf verschiedene Weise auf die Threads aufteilen. Frühe Windows-Programme zeigten das unangenehme Verhalten, dass sie ihre Rechenzeit nicht abgaben. Die Kooperation mit anderen Programmen beziehungsweise dem System war nicht mehr gegeben.
Auf das Ende mit yield() warten
Neben sleep() gibt es noch eine weitere Methode, um kooperative Threads zu programmieren: die Methode yield(). Sie funktioniert etwas anders als sleep(), denn sie fügt den Thread bezüglich seiner Priorität in die Thread-Warteschlange des Systems ein. Die Warteschlange nimmt die Threads immer entsprechend der Priorität heraus (Prioritätswarteschlange), und daher laufen einige Threads öfter und andere weniger oft. Die Priorität kann von 1 bis 10 eingestellt werden - normal ist 5. Wir hätten also im Beispiel mit dem Thread, der auf eine bestimmte Uhrzeit wartet, die Priorität ruhig auf 1 stellen können (mit der Funktion setPriority()). Ein Thread mit der Priorität N wird vor allen Threads mit der Wichtigkeit kleiner N, aber hinter denen der Priorität größer gleich N gesetzt. Ruft nun ein kooperativer Thread mit der Priorität N die Methode yield() auf, bekommt ein Thread mit der Priorität <= N auch eine Chance zur Ausführung.
class java.lang.Thread
implements Runnable
|
|
void yield()
Der laufende Thread wird kurz angehalten und lässt andere Threads auch zum Zuge kommen. Das ist die Idee der Methode, aber sie ist nicht verbindlich. |
|