-
Was sind alle Zustände des Objekts
Thread
?- NEU
- LAUFBAR
- VERSTOPFT
- WARTEN
- TIMED_WAITING
- BEENDET
-
In welche Zustände kann ein Thread gehen, wenn er einen Block betritt
synchronized
?- LAUFBAR
- VERSTOPFT
In RUNNABLE, wenn der markierte Codeblock
synchronized
nicht von einem anderen Thread belegt ist. Andernfalls erhält unser Thread den Status BLOCKED und wartet auf die Freigabe des Mutex-Objekts. - In welchen Zustand geht der Thread, wenn er die Methode aufruft
wait()
?Durch den Aufruf dieser Methode wird der Thread in den Status WAITING versetzt.
Die Methodewait()
kann nur innerhalb eines Blocks eines Mutex-Objekts aufgerufen werden,synchronized
das vom aktuellen Thread „gesperrt“ wurde, andernfalls löst die Methode eine IllegalMonitorStateException- Ausnahme aus .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Wenn eine Methode aufgerufen wirdwait()
, hebt der aktuelle Thread die Sperre des Objekts auf und geht in den Status WAITING über, in dem er darauf wartet, dass die Methode von einem anderen Threadmonitor
aufgerufen wird . Sobald dies geschieht, wird der Thread aktiviert und wenn der Monitor nicht ausgelastet war, greift er darauf zu und arbeitet weiter. Wenn der Monitor von einem anderen Thread belegt ist, wechselt der aktuelle Thread in den Status BLOCKED.monitor.notify()
monitor.notifyAll()
-
In welchen Zustand geht der Thread, wenn er die Methode aufruft
Durch den Aufruf dieser Methode wird der Thread in den Status TIMED_WAITING versetzt.wait(500)
?
Analog zur Methode kann sie nur innerhalb eines Blocks auf einem Mutex-Objekt aufgerufen werden,wait()
das vom aktuellen Thread „gesperrt (gesperrt)“ wurde.wait(timeout)
synchronized
Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Beim Aufruf der Methode
wait()
hebt der aktuelle Thread die Sperre des Objekts aufmonitor
und geht für 500 Millisekunden in den Ruhezustand. Das Objektmonitor
wurde möglicherweise von einem anderen Thread erfasst.
Nach 500 Millisekunden wird der Thread aktiviert und wennmonitor
er nicht beschäftigt war, greift er darauf zu und arbeitet weiter.
Wenn der Monitor von einem anderen Thread belegt ist, wechselt der aktuelle Thread in den Status BLOCKED.In welchen Zustand geht der Thread, wenn er die Methode aufruft
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Danachmonitor.wait()
wechselt der Thread in den Wartestatus.notify()
Eine von einem anderen Thread für ein Objekt aufgerufene Methodemonitor
verschiebt den Thread vom Status WAITING in den Status RUNNABLE, es sei denn, das Monitorobjekt wird von einem anderen Thread erfasst, andernfalls in den Status BLOCKED. -
In welchen Zustand geht der Thread, wenn er die Methode aufruft
notifyAll()
?notifyAll()
„bleiben“ alle Threads. Einer aller „schlafenden“ (WAITING) Threads geht in den RUNNABLE-Zustand über, übernimmt den Monitor des verwendeten Objekts und setzt seine Arbeit fort. Der Rest befindet sich im Status BLOCKIERT. Sobald der erste „aufwachende“ Thread den Monitor freigibt, auf den alle anderen warten, wird sein Schicksal vom nächsten Thread wiederholt (ein beliebiger Thread wechselt vom Status BLOCKED in den Status RUNNABLE). Dies wird so lange fortgesetzt, bis alle „erwachten“ Threads den BLOCKED-Zustand verlassen. -
Drei Threads im synchronisierten Block werden als
Zwei davon wechseln in den Status BLOCKED, einer in den Status RUNNABLEwait()
Mutex-Objekt bezeichnet. In welchen Zustand gehen diese Threads, wenn der vierte Thread aufruftnotifyAll()
? -
Wie unterscheidet es sich
Trotz der Tatsache, dass und den aktuellen Thread in den Status TIMED_WAITINGjoin(500)
vonwait(500)
?join(500)
überführtwait(500)
, gibt es erhebliche Unterschiede zwischen ihnen:join(500)
Wird für einen Thread aufgerufen,wait(500)
wird innerhalb eines synchronisierten Blocks für das Objekt aufgerufen, mit dem dieser Block synchronisiert ist.
Beim Aufrufjoin(500)
wartet der aktuelle Thread 500 Millisekunden auf denjoin()
Abschluss des Threads, dessen Methode aufgerufen wurde.
Beim Aufrufwait(500)
hebt der aktuelle Thread die Sperre des synchronisierten Objekts auf und geht für 500 Millisekunden in den Ruhezustand.
Nach 500 Millisekunden funktionieren die Threads in beiden Fällen weiter. -
Wie unterscheidet es sich
wait(500)
vonsleep(500)
?sleep(500)
Wird in einem Thread aufgerufen,wait(500)
wird innerhalb eines synchronisierten Blocks für das Objekt aufgerufen, auf dem dieser Block synchronisiert ist.
Beim Aufrufsleep(500)
wartet der aktuelle Thread 500 Millisekunden und setzt dann seine Arbeit fort.
Beim Aufrufwait(500)
hebt der aktuelle Thread die Sperre des synchronisierten Objekts auf und geht für 500 Millisekunden in den Ruhezustand. -
In welchen Zustand geht der Thread, wenn er die Methode aufruft
Wenn eine Methode aufgerufen wirdyield()
?yield()
, „überspringt“ der aktuelle Thread seinen Zug und Java wechselt sofort zur Ausführung des nächsten Threads. Der Thread geht von Staatrunning
zu Staatready
. Die Status „Laufend“ und „Bereit“ sind Unterzustände des Status „RUNNABLE“.
GO TO FULL VERSION