Quelle est la différence entre l'état de thread WAIT et l'état de thread BLOCKED?
La documentation Thread.State :
Bloqué
Un thread bloqué en attente d'un verrouillage du moniteur est dans cet état.En attente
Un thread qui attend indéfiniment qu'un autre thread effectue une action particulière est dans cet état
ne m'explique pas la différence.
java
multithreading
block
wait
Plus de cinq
la source
la source
Réponses:
Un thread passe à l'état d'attente une fois qu'il appelle
wait()
un objet. C'est ce qu'on appelle l' état d' attente . Une fois qu'un thread atteint l'état d'attente, il devra attendre qu'un autre thread appellenotify()
ounotifyAll()
sur l'objet.Une fois que ce thread est notifié, il ne sera pas exécutable. Il se peut que d'autres threads soient également notifiés (en utilisant
notifyAll()
) ou que le premier thread n'ait pas terminé son travail, il est donc toujours bloqué jusqu'à ce qu'il ait sa chance. C'est ce qu'on appelle l' état bloqué . Un état bloqué se produit chaque fois qu'un thread essaie d'acquérir un verrou sur un objet et qu'un autre thread détient déjà le verrou.Une fois que d'autres threads sont partis et que c'est cette chance de thread, il passe à l'état Runnable après qu'il est éligible au travail de ramassage basé sur le mécanisme de thread JVM et passe à l'état d'exécution.
la source
La différence est relativement simple.
Dans l'
BLOCKED
état, un thread est sur le point d'entrer dans unsynchronized
bloc, mais il y a un autre thread en cours d'exécution à l'intérieur d'unsynchronized
bloc sur le même objet. Le premier thread doit ensuite attendre que le second thread quitte son bloc.Dans l'
WAITING
état, un thread attend un signal d'un autre thread. Cela se produit généralement en appelantObject.wait()
ouThread.join()
. Le thread restera alors dans cet état jusqu'à ce qu'un autre thread appelleObject.notify()
ou meure.la source
Object.wait()
directement, mais vous vous retrouvez dans l'WAITING
état en utilisant également les constructions de concurrence de haut niveau - comme les verrous, les files d'attente de blocage, etc. en gros, chaque fois que deux threads doivent se coordonner.RUNNING
état.Thread.State
dit: "... Ces états sont des états de machine virtuelle qui ne reflètent aucun état de thread du système d'exploitation." En d'autres termes, la JVM ne se soucie pas de la différence entre un thread qui exécute du code Java, un thread qui attend le retour d'un appel système ou un thread qui attend une tranche de temps. Tout celaRUNNABLE
concerne la JVM.WAITING
état, il doit d'abord passer à l'BLOCKED
état jusqu'à ce qu'il puisse acquérir le verrou associé à l'objet qu'il attendait.La différence importante entre les états bloqué et d'attente est l'impact sur le planificateur. Un thread dans un état bloqué est en compétition pour un verrou; ce thread compte toujours comme quelque chose que le planificateur a besoin de traiter, pouvant être pris en compte dans les décisions du planificateur sur le temps imparti aux threads en cours d'exécution (afin qu'il puisse donner une chance aux threads bloquant sur le verrou).
Une fois qu'un thread est en état d'attente, le stress qu'il met sur le système est minimisé et le planificateur n'a pas à s'en soucier. Il passe en veille jusqu'à ce qu'il reçoive une notification. À l'exception du fait qu'il garde un thread du système d'exploitation occupé, il est entièrement hors jeu.
C'est pourquoi l'utilisation de notifyAll est loin d'être idéale, cela provoque le réveil d'un tas de threads qui étaient auparavant heureusement dormants sans aucune charge sur le système, où la plupart d'entre eux se bloqueront jusqu'à ce qu'ils puissent acquérir le verrou, trouver la condition dans laquelle ils sont attendre n'est pas vrai, et recommencez à attendre. Il serait préférable de ne notifier que les threads qui ont une chance de progresser.
(L'utilisation de ReentrantLock au lieu de verrous intrinsèques vous permet d'avoir plusieurs conditions pour un verrou, afin que vous puissiez vous assurer que le thread notifié est celui qui attend une condition particulière, évitant ainsi le bogue de notification de perte dans le cas où un thread est notifié pour quelque chose sur lequel il ne peut pas agir.)
la source
Perspective simplifiée pour l'interprétation des thread dumps:
la source
RUNNABLE
pas tout à fait raison. Il peut se trouver dans la file d'attente d'exécution Java mais ne pas s'exécuter ou il peut exécuter du code Java. Il n'est pas nécessaire de faire appel à la terre d'origine.Bloqué - Votre thread est dans l'état exécutable du cycle de vie du thread et tente d'obtenir le verrouillage d'objet. Wait - Votre thread est en attente du cycle de vie du thread et attend que le signal de notification entre dans l'état exécutable du thread.
la source
voir cet exemple:
démonstration des états des threads.
la source