-
Quels sont tous les états de l'objet
Thread
?- NOUVEAU
- EXÉCUTIF
- BLOQUÉ
- EN ATTENDANT
- TIMED_WAITING
- TERMINÉ
-
Dans quels états un thread peut-il passer lorsqu'il entre dans un bloc
synchronized
?- EXÉCUTIF
- BLOQUÉ
En RUNNABLE, si le bloc de code marqué
synchronized
n'est pas occupé par un autre thread. Sinon, notre thread recevra l'état BLOCKED et attendra que l'objet mutex soit libéré. - Dans quel état le thread ira-t-il lors de l'appel de la méthode
wait()
?L’appel de cette méthode place le thread dans l’état WAITING.
La méthodewait()
ne peut être appelée qu'à l'intérieur d'un blocsynchronized
sur un objet mutex qui a été « verrouillé » par le thread actuel, sinon la méthode lèvera une exception IllegalMonitorStateException .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Lorsqu'une méthode est appeléewait()
, le thread actuel libère le verrou de l'objetmonitor
et entre dans l'état WAITING, en attendant que la méthode soit appeléemonitor.notify()
parmonitor.notifyAll()
un autre thread. Dès que cela se produit, le thread se réveillera et si le moniteur n'était pas occupé, il le récupérera et continuera à fonctionner.
Si le moniteur est occupé par un autre thread, le thread actuel passera à l'état BLOCKED. -
Dans quel état le thread ira-t-il lors de l'appel de la méthode
L’appel de cette méthode place le thread dans l’état TIMED_WAITING.wait(500)
?
Par analogie avec la méthodewait()
,wait(timeout)
elle ne peut être appelée qu'à l'intérieur d'un blocsynchronized
sur un objet mutex qui a été « verrouillé (verrouillé) » par le thread courant.Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Lors de l'appel de la méthode
wait()
, le thread actuel libère le verrou de l'objetmonitor
et se met en veille pendant 500 millisecondes. L'objetmonitor
peut être capturé par un autre thread.
Après 500 millisecondes, le thread se réveillera et s'ilmonitor
n'était pas occupé, il le récupérera et continuera à fonctionner.
Si le moniteur est occupé par un autre thread, le thread actuel passera à l'état BLOCKED.Dans quel état le thread ira-t-il lors de l'appel de la méthode
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Aprèsmonitor.wait()
, le thread passera à l'état WAITING. Une méthodenotify()
appelée par un autre thread sur un objetmonitor
déplacera le thread de l'état WAITING à l'état RUNNABLE sauf si l'objet moniteur est capturé par un autre thread, sinon à l'état BLOCKED. -
Dans quel état le thread ira-t-il lors de l'appel de la méthode
notifyAll()
?notifyAll()
"restera" tous les fils de discussion. L'un de tous les threads "en veille" (WAITING) passera à l'état RUNNABLE, prendra le contrôle du moniteur de l'objet utilisé et poursuivra son travail. Le reste sera à l’état BLOQUÉ. Dès que le premier thread de « réveil » libère le moniteur, ce que tout le monde attend, son sort sera répété par le thread suivant (un thread arbitraire passera de l'état BLOCKED à l'état RUNNABLE). Cela continuera jusqu'à ce que tous les threads « réveillés » quittent l'état BLOQUÉ. -
Trois threads dans le bloc synchronisé appelés
Deux d'entre eux passeront à l'état BLOQUÉ, un à l'état RUNNABLE.wait()
l'objet mutex. Dans quel état ces threads iront-ils si le quatrième thread appellenotifyAll()
? -
En quoi est-ce différent
Malgré le fait que etjoin(500)
dewait(500)
?join(500)
ferawait(500)
passer le thread actuel à l'état TIMED_WAITING, il existe des différences significatives entre eux :join(500)
appelé sur un thread,wait(500)
appelé à l'intérieur d'un bloc synchronisé sur l'objet sur lequel ce bloc est synchronisé.
Lorsqu'il est appelé,join(500)
le thread actuel attendra 500 millisecondes pour que le thread dont la méthodejoin()
a été appelée se termine.
Lorsqu'il est appelé,wait(500)
le thread actuel libère le verrou de l'objet synchronisé et se met en veille pendant 500 millisecondes.
Après 500 millisecondes, dans les deux cas, les threads continueront à fonctionner. -
En quoi est-ce différent
wait(500)
desleep(500)
?sleep(500)
appelé sur un thread,wait(500)
appelé à l'intérieur d'un bloc synchronisé sur l'objet sur lequel ce bloc est synchronisé.
Lorsqu'il est appelé,sleep(500)
le thread actuel attendra 500 millisecondes, puis continuera son travail.
Lorsqu'il est appelé,wait(500)
le thread actuel libère le verrou de l'objet synchronisé et se met en veille pendant 500 millisecondes. -
Dans quel état le thread ira-t-il lors de l'appel de la méthode
Lorsqu'une méthode est appeléeyield()
?yield()
, le thread actuel « saute son tour » et Java passe immédiatement à l'exécution du thread suivant. Le fil passe d'unrunning
état à l'autreready
. Les états en cours d'exécution et prêt sont des sous-états de l'état RUNNABLE.
GO TO FULL VERSION