Les cinq états du thread Java : 1. État initial. 2. État exécutable, situé dans le pool de threads exécutables, en attente d'être sélectionné par la planification des threads pour obtenir le droit d'utiliser le CPU. 3. État de fonctionnement. 4. L'état bloqué signifie que le thread a renoncé au droit d'utiliser le processeur pour une raison quelconque. 5. Dans l'état de mort, le fil mort ne peut pas être ressuscité.
Le cycle de vie d'un thread en Java peut être grossièrement divisé en 5 états.
1. État initial (NOUVEAU) : Un nouvel objet thread est créé.
2. Runnable (RUNNABLE) : Une fois l'objet thread créé, d'autres threads (tels que le thread principal) appellent la méthode start() de l'objet. Le thread dans cet état se trouve dans le pool de threads exécutables, en attente d'être sélectionné par la planification des threads pour obtenir le droit d'utiliser le processeur.
3. RUNNING : Le thread à l'état exécutable obtient la tranche de temps du processeur (timeslice) et exécute le code du programme.
4. BLOQUÉ : L'état bloqué signifie que le thread abandonne le droit d'utiliser le processeur pour une raison quelconque, c'est-à-dire qu'il abandonne la tranche de temps du processeur et arrête temporairement de fonctionner. Jusqu'à ce que le thread entre dans l'état exécutable, il a la possibilité d'obtenir à nouveau la tranche de temps du processeur et de passer à l'état d'exécution. Il existe trois situations de blocage :
(1) En attente de blocage : le thread en cours d'exécution exécute la méthode o.wait() et la JVM placera le thread dans la file d'attente du milieu.
(2) Blocage synchrone : lorsqu'un thread en cours d'exécution acquiert le verrou de synchronisation d'un objet, si le verrou de synchronisation est occupé par un autre thread, la JVM placera le thread dans le pool de verrouillage) au milieu.
(3) Autres blocages : lorsqu'un thread en cours d'exécution exécute la méthode Thread.sleep(long ms) ou t.join(), ou émet une requête d'E/S, la JVM définit le thread comme étant en cours état de blocage. Lorsque l'état sleep() expire, join() attend que le thread se termine ou expire, ou que le traitement des E/S est terminé, le thread revient à l'état exécutable.
5. Mort (DEAD) : lorsque l'exécution des méthodes run() et main() du thread se termine, ou que la méthode run() se termine en raison d'une exception, le thread termine son cycle de vie. . Les fils morts ne peuvent pas être ressuscités.
1. Diagramme d'état du thread
2. État initial
Implémentation exécutable L'interface et l'héritage du Thread peuvent obtenir une classe de thread Lorsqu'une nouvelle instance sort, le thread entre dans l'état initial
3. État exécutable
1. État exécutable Il. signifie simplement que vous êtes qualifié pour exécuter. Si le planificateur ne vous sélectionne pas, vous serez toujours dans un état exécutable.
2. Appelez la méthode start() du thread et le thread entre dans l'état exécutable.
3. La méthode sleep() du thread actuel se termine et la méthode join() des autres threads se termine une fois la saisie de l'utilisateur terminée, un thread obtient le verrou d'objet et ces threads entreront également. l'état exécutable.
4. La tranche de temps du thread actuel est épuisée. Appelez la méthode rendement() du thread actuel et le thread actuel entre dans l'état exécutable.
5. Une fois que le thread du pool de verrouillage a obtenu le verrou d'objet, il entre dans l'état exécutable.
4. État d'exécution
L'état du thread lorsque le planificateur de threads sélectionne un thread du pool exécutable comme thread actuel. C'est également le seul moyen pour un thread d'entrer dans l'état d'exécution.
5. État de mort
1. Lorsque la méthode run() du thread est terminée, ou lorsque la méthode main() du thread principal est terminée, nous le considérons comme mort. Cet objet thread peut être vivant, mais ce n'est plus un thread exécuté séparément. Une fois qu'un fil meurt, il ne peut plus être relancé.
2. L'appel de la méthode start() sur un thread mort lèvera une exception java.lang.IllegalThreadStateException.
6. État de blocage
1. Le thread actuel T appelle la méthode Thread.sleep() et le thread actuel entre dans l'état de blocage.
2. Un autre thread t2 exécuté dans le thread actuel appelle la méthode join() et le thread actuel entre dans l'état de blocage.
3. En attendant la saisie de l'utilisateur, le thread actuel entre dans l'état de blocage.
7. File d'attente (à l'origine une méthode dans Object, mais elle affecte le thread)
1 Avant d'appeler les méthodes wait() et notify() d'obj. , Le verrou obj doit être obtenu, c'est-à-dire qu'il doit être écrit dans le segment de code synchronisé (obj).
2. Étapes et diagrammes liés à la file d'attente
Le thread 1 acquiert le verrou de l'objet A et utilise l'objet A.
Le thread 1 appelle la méthode wait() de l'objet A.
Le thread 1 libère le verrou de l'objet A et entre immédiatement dans la file d'attente.
Les objets dans le pool de verrouillage se disputent le verrouillage de l'objet A.
Le thread 5 obtient le verrou de l'objet A, entre dans le bloc synchronisé et utilise l'objet A.
Le thread 5 appelle la méthode notifyAll() de l'objet A, réveille tous les threads et tous les threads entrent dans le pool de verrouillage. ||||| Le thread 5 appelle la méthode notify() de l'objet A pour réveiller un thread. On ne sait pas qui sera réveillé.
L'emplacement synchronisé de la méthode notifyAll() se termine et le thread 5 libère le verrou de l'objet A.
Les threads du pool de verrouillage sont en compétition pour le verrouillage de l'objet, mais on ne sait pas quand le thread 1 peut le récupérer. ||||| Le pool de verrouillage d'origine + le thread réveillé à l'étape 6 se disputent ensemble le verrouillage de l'objet.
8. Verrouiller l'état du pool
Le fil de discussion actuel souhaite appeler la méthode de synchronisation. de l'objet A Lorsqu'il s'avère que le verrou de l'objet A est occupé par un autre thread, le thread actuel entre dans l'état du pool de verrouillage. En bref, le pool de verrous est rempli de threads qui veulent rivaliser pour les verrous d'objets.
Lorsqu'un thread 1 est réveillé par un autre thread 2, le thread 1 entre dans l'état du pool de verrouillage pour rivaliser pour le verrouillage de l'objet.
Lock pool est un concept qui n'existe que dans un environnement synchronisé. Un objet correspond à un lock pool.
9. Comparaison de plusieurs méthodes
Thread.sleep(long millis), cette méthode doit être appelée par le thread actuel. Le thread actuel entre en blocage mais ne l'entre pas. Libérez l'objet. Après le verrouillage et millis, le thread se réveille automatiquement et entre dans l'état exécutable. Fonction : La meilleure façon de donner à d’autres threads une chance de s’exécuter.
Thread.yield(), cette méthode doit être appelée par le thread actuel. Le thread actuel abandonne la tranche de temps CPU acquise, passe de l'état d'exécution à l'état exécutable et permet au système d'exploitation de sélectionner le enfiler à nouveau. Fonction : laissez les threads avec la même priorité s'exécuter à tour de rôle, mais il n'y a aucune garantie qu'ils s'exécuteront à leur tour. En pratique, il n'y a aucune garantie que rendement() atteindra l'objectif de concession, car le thread de concession peut être à nouveau sélectionné par le planificateur de threads. Thread.yield() ne provoque pas de blocage.
t.join()/t.join(long millis), le thread actuel appelle la méthode de jointure de l'autre thread 1, le thread actuel se bloque, mais ne libère pas le verrou d'objet tant que le thread 1 n'a pas terminé son exécution ou le temps millis expire, le thread actuel entre dans l'état exécutable.
obj.wait(), le thread actuel appelle la méthode wait() de l'objet, le thread actuel libère le verrou de l'objet et entre dans la file d'attente. Fiez-vous à notify()/notifyAll() pour vous réveiller ou attendez (long timeout) pour vous réveiller automatiquement.
obj.notify() réveille un seul thread en attente sur ce moniteur d'objets. Le choix est arbitraire. notifyAll() réveille tous les threads en attente sur ce moniteur d'objets.
Tutoriel recommandé : "Tutoriel Java"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!