Quels sont les états des threads Java ?
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.
