Die Programmiersprache Ruby (German Edition)
abzufragen.
alive?
gibt
true
zurück, wenn ein Thread ausführbar ist oder schläft.
stop?
gibt
true
zurück, wenn ein Thread gerade nicht ausführbar ist. Schließlich liefert die Methode
status
den Zustand des Threads zurück. Es gibt fünf mögliche Rückgabewerte, die den fünf möglichen Zuständen entsprechen (siehe die folgende Tabelle).
Thread-Zustand
Rückgabewert
Ausführbar
"run"
Schlafend
"sleep"
Abbrechend
"aborting"
normal beendet
false
mit Exception beendet
nil
9.9.4.2 Zustand ändern: Pausieren, Aufwecken und Abschießen von Threads
Threads werden im Zustand ausführbar erzeugt und können direkt loslaufen. Ein Thread kann sich selbst pausieren lassen – also in den Zustand schlafend wechseln – indem er
Thread.stop
aufruft. Das ist eine Klassenmethode, die mit dem aktuellen Thread arbeitetes gibt keine entsprechende Instanzmethode, daher kann ein Thread keinen anderen dazu zwingen, sich schlafen zu legen. Ein Aufruf von
Thread.stop
entspricht im Prinzip einem Aufruf von
Kernel.sleep
ohne Argument: Der Thread wartet unendlich lange (oder bis er aufgeweckt wird, wie weiter unten erläutert).
Threads können auch temporär in den Zustand schlafend wechseln, wenn sie
Kernel.sleep
mit einem Argument aufrufen. In diesem Fall wachen sie automatisch auf und wechseln nach (ungefähr) der angegebenen Anzahl von Sekunden wieder in den Zustand ausführbar . Ein Aufruf von blockierenden
IO
-Methoden kann auch dazu führen, dass ein Thread schläft, bis die
IO
-Operation beendet ist – tatsächlich ist es die den
IO
-Operationen eigene Latenz, die Threading auch auf Systemen mit nur einer CPU sinnvoll macht.
Ein Thread, der sich selbst mit
Thread.stop
oder
Kernel.sleep
in den schlafenden Zustand versetzt hat (selbst wenn eine angegebene Pausenzeit noch nicht abgelaufen ist), kann mit den Instanzmethoden
wakeup
und
run
wieder geweckt werden. Beide Methoden bringen den Thread aus dem Zustand schlafend in den Zustand ausführbar . Die Methode
run
ruft zudem noch den Thread Scheduler auf. Damit wird dafür gesorgt, dass der aktuelle Thread die CPU freigibt und ein gerade aufgewachten Thread eventuell loslaufen kann. Die Methode
wakeup
weckt den angegebenen Thread auf, ohne die CPU freizugeben.
Ein Thread kann sich selbst aus dem Zustand ausführbar in einen der beendeten Zustände bringen, indem er einfach seinen Block verlässt oder eine Exception wirft. Eine andere Möglichkeit für einen Thread, sich ordnungsgemäß zu beenden, ist ein Aufruf von
Thread.exit
. Beachten Sie, dass noch jegliche
ensure
-Klauseln abgearbeitet werden, bevor der Thread auf diese Weise beendet wird.
Ein Thread kann einen anderen Thread mit Gewalt beenden, indem er dessen Instanzmethode
kill
aufruft.
terminate
und
exit
sind Synonyme für
kill
. Diese Methoden bringen den abgeschossenen Thread in den Zustand normal beendet . Der beendete Thread führt jegliche
ensure
-Klauseln aus, bevor er tatsächlich stirbt. Die Methode
kill!
(und ihre Synonyme
terminate!
und
exit!
) beenden einen Thread, bringen aber keine
ensure
-Klauseln zur Ausführung.
Alle bisher zum Beenden eines Threads beschriebenen Methoden zwingen einen Thread in den Zustand normal beendet . Sie können in einem anderen Thread eine Exception werfen, indem Sie die Instanzmethode
raise
nutzen. Wenn der Thread die von Ihnen ausgelöste Exception nicht handhaben kann, wird er in den Zustand mit Exception beendet wechseln. Die
ensure
-Klauseln werden so verarbeitet, als würden sie ganz normal während der Exception-Behandlung ausgeführt.
Das Abschießen eines Threads ist eine gefährliche Sache, sofern Sie nicht irgendwie sicher sein können, dass der Thread nicht gerade beim Ändern eines gemeinsam genutzten Zustands Ihres Systems ist. Schießt man einen Thread mit einer der
!
-Methoden ab, ist das sogar noch gefährlicher, da der abgeschossene Thread eventuell Dateien, Sockets oder andere Ressourcen offen zurücklässt. Wenn ein Thread auf Befehl beendet werden können muss, ist es besser, ihn regelmäßig den Zustand einer booleschen Variable abfragen und sich selber sicher und würdevoll beenden zu lassen, wenn die Variable gesetzt wird.
9.9.5 Threads und Thread-Gruppen auflisten
Die Methode
Thread.list
liefert ein Array mit
Thread
-Objekten zurück, die alle aktiven (lauffähigen oder schlafenden) Threads repräsentieren. Wenn ein Thread beendet wird, wird er aus diesem Array entfernt.
Jeder Thread außer dem Haupt-Thread wird durch einen anderen Thread
Weitere Kostenlose Bücher