Maison >Java >javaDidacticiel >Introduction au cycle de vie des threads Java (avec exemples)

Introduction au cycle de vie des threads Java (avec exemples)

不言
不言avant
2019-04-13 10:01:096142parcourir

Cet article vous apporte une introduction au cycle de vie des threads Java (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1. Cycle de vie d'un thread

Les processus, comme les threads, ont un certain cycle de vie. Le cycle de vie d'un thread comprend quatre états : l'état de création, l'état prêt, l'état de blocage et l'état de mort. .

1. Statut de création

1) fait référence à l'utilisation de new pour instancier un objet thread, mais l'objet thread n'a pas encore utilisé la méthode start() pour démarrer le thread. en mémoire. L'espace mémoire est alloué pour les variables d'instance de l'objet dans le tas, mais le thread ne peut pas participer à l'obtention du droit d'utiliser le CPU

2) Une fois l'objet thread créé, la méthode start() ; est utilisé pour démarrer l'objet thread, et non la méthode run().

2. L'état Prêt

1) fait référence à l'étape à partir du moment où un objet thread utilise la méthode start() jusqu'à la fin de l'exécution de la méthode run(). la machine virtuelle Java Créer la pile d'appels et le compteur de la méthode pour le thread ;

2) Dans une certaine unité de temps (tranche de temps), le CPU ne peut exécuter qu'un seul thread une fois qu'un thread en a le droit. pour utiliser le CPU, alors Ce thread peut également être appelé un état en cours d'exécution ;

3) Tous les threads à l'état prêt sont considérés comme actifs. Vous pouvez utiliser la méthode isAlive() pour tester si le thread est dans l'état prêt. état prêt et utilisez activeCount() pour interroger le nombre actuel de threads actifs dans le pool de threads où se trouve le thread

4) Le thread à l'état prêt n'est pas en cours d'exécution ; Dans le passé, de nombreux ordinateurs étaient monoprocesseurs et tous les threads prêts devaient être exécutés en même temps. Il est impossible que Java utilise certains algorithmes de planification pour garantir que ces threads partagent l'utilisation du processeur (comme la tranche de temps). algorithme de rotation, algorithme exclusif, etc.).

3. État de blocage :

1) L'état de blocage comprend quatre états (état de veille, état de blocage, état de suspension, état d'attente de manière générale, l'état de blocage et l'état de blocage). l'état prêt peut être commuté entre eux ;

2) Utilisez la méthode sleep() pour mettre le thread en état de veille, permettant à d'autres processus d'avoir une chance de s'exécuter, mais l'utilisation de la méthode sleep doit capturer l'InterruptedExection. exception ;

3) Utilisez la méthode suspend pour suspendre le thread (obsolète après jdk1.2), utilisez la méthode wait pour mettre le thread en état d'attente (il y aura un essai qui lui sera dédié plus tard), et utilisez l'interruption d'E/S pour mettre le thread dans l'état de blocage.

4. État de mort :

1) Une fois que le thread a fini d'exécuter la méthode run, le thread entre dans l'état de mort et la machine virtuelle Java détruit les ressources système occupées par l'objet thread dans l'état de mort ;

2) Lorsque le thread rencontre une exception non interceptée pendant l'exécution, le thread sera terminé et entrera dans l'état de mort ; l'appel de la méthode stop peut également faire entrer le thread dans l'état de mort, mais c'est le cas. facile à provoquer une impasse et est obsolète.

5. Le cycle de vie du thread est le suivant :

2. Ce qui suit est un cas où la méthode sleep met le passer en état de veille

/**
 * @author: PrincessHug
 * @date: 2019/4/12, 9:20
 * @Blog: https://www.cnblogs.com/HelloBigTable/
 */
public class SleepDemo  implements Runnable{
    @Override
    public void run() {
        long l;
        for (int i=1;i<6;i++){
            l = System.currentTimeMillis();
            try {
                Thread.currentThread().sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            l = (System.currentTimeMillis() - l);
            System.out.println(Thread.currentThread().getName() + "线程执行了" + i + "次,耗时" + l + "毫秒。");
        }
    }
}
public class SleepDriver {
    public static void main(String[] args) {
        SleepDemo sd = new SleepDemo();
        for (int i=0;i<50;i++){
            new Thread(sd,i + "#").start();
        }
    }
}

Voici quelques captures d'écran des résultats en cours d'exécution :

Vous pouvez voir si plusieurs fils de discussion sont démarrés en même temps, chaque fil prendra plus de temps.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer