Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


11.4

Prioritäten und Scheduling


In Java hat jeder Thread eine Priorität, die dazu dient, eine Vorrangregelung bei der Zuteilung der CPU zu treffen. Dieses Zuteilen der CPU(s) an die Threads wird Scheduling genannt.

Die Thread-Priorität ist in Java eine ganze Zahl zwischen 1, der niedrigsten Priorität, und 10, was der höchsten Priorität entspricht. Die Zahlen wachsen also mit der Priorität, im Gegensatz zu UNIX-Systemen, wo es genau umgekehrt ist. Die voreingestellte Priorität (Thread.NORM_PRIORITY) ist 5. Zum Einstellen und Ermitteln der Priorität eines Threads stellt Thread die Methoden getPriority() und setPriority() zur Verfügung.

Die einzige Vorgabe, die die Java-Sprachspezifikation zum Thread-Scheduling macht, ist die, dass es hierarchisch ist. Das heißt, dass ein Thread erst dann ausgeführt wird, wenn alle Threads mit höherer Priorität momentan nicht rechenwillig sind. Über das Scheduling unter Threads mit gleicher Priorität macht die Spezifikation dagegen keinerlei Aussagen. Aus diesem Grund sollten Programme, die Multithreading nutzen und auf verschiedenen Plattformen laufen sollen, sorgfältig daraufhin getestet werden, ob sie »rund« laufen.

So wurden Threads in älteren Versionen der Virtual Machine des JDK unter Solaris und Linux mit Green Threads implementiert. Bei diesen Virtual Machines behielt ein Thread solange die CPU, bis er zu Ende war oder blockiert wurde. Solange keine dieser beiden Bedingungen eintrat, wurde einem Thread die CPU nie entzogen, auch dann nicht, wenn andere Threads mit gleicher Priorität rechenwillig waren (so genanntes nicht-präemptives Scheduling). Das hatte zur Folge, dass sich in Programmen teilweise unerwünschte Effekte einstellten, weil andere Threads nicht an die Reihe kamen. Unter Windows dagegen wird einem Thread auch nach Ablauf einer gewissen Zeitspanne die CPU entzogen, so dass die CPU-Zuteilung stets »rotiert« (präemptives Scheduling). Heute verwenden auch die Solaris- und Linux-Versionen der Virtual Machine von Sun eine präemptive Scheduling-Strategie.

Unter anderem aus den zuvor geschilderten Gründen kann es geschehen, dass ein paralleles Programm ins Stocken gerät oder sich nicht so verhält wie erwartet. Abhilfe kann man durch Variieren der Prioritäten der beteiligten Threads schaffen. Ausschlaggebend ist hierbei nicht die absolute Höhe, sondern die Abstufung zwischen den beteiligten Threads.

Alternativ kann man insbesondere auf den genannten älteren Virtual Machines auf die Methode Thread.yield() zurückgreifen. yield() bewirkt, dass ein Thread freiwillig auf die CPU verzichtet und anderen rechenwilligen Threads mit der gleichen Priorität die Gelegenheit zur Ausführung gibt. Falls es keine anderen rechenwilligen Threads mit der gleichen Priorität gibt, bleibt der Aufruf wirkungslos.


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.