Folgendes Diagramm verdeutlicht die Zustände eines Threads der Java Virtuellen Maschine (Version 1.1 Java Developers Kit).
Quelle: JAVA 2 Certification Study Guide, Roberts - Heller - Ernest, Sybex 2005
Jeder Thread ist immer genau in einem der obigen Zustände.
Grüne (aktive, normal geschriebene) Zustandsübergänge können vom Thread selbst erzeugt werden. Rote (passive, kursiv geschriebene) Zustandsübergänge werden von anderen Threads oder vom scheduler des Systems verursacht.
Beim Doppelpfeil zwischen den Zuständen ready und
running zeigt der
yield()-Zustandsübergang von
running nach ready.
Der sheduler zeigt in beide
Richtungen.
Ein Thread muss seinen running-Zustand verlassen,
wenn ein Thread höherer Priorität im ready-Zustand wartet.
Es ist dem Betriebsystem überlassen, auch sonst Threads aus
ready und running zu vertauschen. Das geschieht z.B. bei
einem time-slicing Betriebsystem.
Pro virtuelle Maschine und Prozessor ist immer nur genau ein Thread im Status Running.
Jedes Objekt hat genau einen Objects-Lock (rote Markierung L). Jeder Thread kann diesen Lock erhalten. Der Lock gehört dann während einer gewissen Zeit genau zu einem Thread. Der Lock wird erhalten, wenn ein Thread bei der Ausführung in einen synchronisierten Block gelangt (synchronized(object) { ... } ).
Die wait()-Routine kann nur innerhalb von synchronisiertem Code aufgerufen werden. Das bedeutet auch, dass ein Thread, der im running-Zustand in den "wait-pool" eines Objektes gelangt immer einen Lock hat. Dieser Lock wird dabei wieder in den "Lock-pool" zurückgelegt.
Ein Thread kann auch in den Zustand blocked gelangen, wenn eine Betriebsystemroutine aufgerufen wird. Das geschieht üblicherweise bei File-Operationen. Sollte von einem Stream oder Reader gelesen werden und sind noch keine Daten vorhanden, so kann das Betriebsystem den Thread in den blocked Zustand führen.
Die Methoden suspend() und resume() habe ich nicht mehr aufgeführt, da sie ab JAVA 1.1 nicht mehr unterstützt werden (deprecated).
Klicke hier für ein interaktives Zustandsdiagramm.