Maison  >  Article  >  Java  >  Analyse approfondie du multithreading Java : compréhension des transitions d'état des threads et de la communication inter-thread

Analyse approfondie du multithreading Java : compréhension des transitions d'état des threads et de la communication inter-thread

王林
王林original
2024-02-19 11:42:06384parcourir

Analyse approfondie du multithreading Java : compréhension des transitions détat des threads et de la communication inter-thread

Analyse des principes multi-thread Java : transition d'état des threads et communication inter-thread

En Java, la programmation multi-thread est une méthode courante pour réaliser un calcul parallèle et améliorer les performances du programme. La programmation multithread peut exploiter pleinement les capacités multicœurs de l'ordinateur, permettant au programme d'effectuer plusieurs tâches en même temps. Cependant, écrire correctement des programmes multithread et garantir leur exactitude et leurs performances est une tâche relativement complexe.

Cet article analysera les principes du multi-threading Java, en se concentrant sur les transitions d'état des threads et la communication entre les threads. Des exemples de code concrets sont fournis pour illustrer ces concepts.

  1. Transition d'état du thread

En Java, l'état d'un thread est représenté par le type d'énumération State dans la classe Thread. Les états courants des threads sont les suivants :

1.1 Nouveau (Nouveau) : lorsque l'objet thread est créé mais que la méthode start() n'a pas été appelée, le thread est dans le nouvel état.

1.2 Exécutable : après avoir appelé la méthode start(), le thread est dans un état exécutable. Les threads dans cet état peuvent attendre l’exécution de la planification du processeur.

1.3 Bloqué : le thread peut suspendre l'exécution car il attend une ressource ou une sorte de situation de blocage se produit. Par exemple, lorsqu'un thread appelle la méthode sleep() ou attend un verrou sur un objet, le thread entre dans un état de blocage.

1.4 En attente : le thread peut entrer dans l'état d'attente en raison de l'appel de la méthode wait() dans la classe Object. Les threads en attente doivent attendre les notifications des autres threads avant de pouvoir poursuivre leur exécution. Par exemple, lorsqu'un thread attend qu'une certaine condition soit remplie.

1.5 Attente chronométrée : similaire à l'état d'attente, mais avec un délai d'attente. Le thread peut attendre le temps spécifié et si le délai d'attente est atteint, le thread se réveillera automatiquement.

1.6 Terminé : une fois que le thread a terminé la tâche ou s'est terminé anormalement, il entre dans l'état terminé.

La transition d'état du thread est illustrée dans la figure ci-dessous :

           |
           V
New -> Runnable -> Blocked -> Runnable -> Terminated
           |    ^        |
           V    |        |
        Waiting <-       |
           |    |
           V    |
   Timed Waiting <---

Ce qui suit est un exemple de code simple montrant le processus de conversion de l'état du thread :

public class ThreadStateExample {
    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(1000); // 线程进入Timed Waiting状态
                synchronized (ThreadStateExample.class) { // 线程进入Blocked状态
                    ThreadStateExample.class.wait(); // 线程进入Waiting状态
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println("Thread state: " + thread.getState()); // NEW
        thread.start();
        System.out.println("Thread state: " + thread.getState()); // RUNNABLE
        Thread.sleep(200); // 让线程有足够的时间进入Timed Waiting状态
        System.out.println("Thread state: " + thread.getState()); // TIMED_WAITING
        Thread.sleep(1000); // 让线程有足够的时间进入Waiting状态
        System.out.println("Thread state: " + thread.getState()); // WAITING
        synchronized (ThreadStateExample.class) {
            ThreadStateExample.class.notify(); // 唤醒线程
        }
        Thread.sleep(200);
        System.out.println("Thread state: " + thread.getState()); // BLOCKED
        thread.join();
        System.out.println("Thread state: " + thread.getState()); // TERMINATED
    }
}
  1. Communication inter-thread

Dans la programmation multi-thread , la communication inter-thread est une technologie importante. La communication inter-thread peut réaliser une coopération entre les threads, permettant aux threads d'exécuter des tâches de manière ordonnée.

Java fournit une multitude de méthodes de communication inter-thread, notamment la mémoire partagée, le mécanisme d'attente/notification, les sémaphores, les moniteurs, etc. Parmi eux, le moyen le plus courant consiste à réaliser une communication inter-thread via des objets partagés.

Les objets partagés sont généralement des objets accessibles par plusieurs threads. L'échange de données et la collaboration entre les threads peuvent être réalisés en lisant et en écrivant des objets partagés.

Ce qui suit est un exemple de code simple montrant le mode de communication entre les threads :

public class ThreadCommunicationExample {
    static class SharedObject {
        private int value;
        private boolean isValueReady;

        public synchronized int getValue() {
            while (!isValueReady) {
                try {
                    wait(); // 等待value准备好
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return value;
        }

        public synchronized void setValue(int value) {
            this.value = value;
            isValueReady = true; // 设置value准备好的标记
            notify(); // 唤醒等待的线程
        }
    }

    public static void main(String[] args) {
        SharedObject sharedObject = new SharedObject();

        Thread readerThread = new Thread(() -> {
            int value = sharedObject.getValue();
            System.out.println("The value is: " + value);
        });

        Thread writerThread = new Thread(() -> {
            int value = 42;
            sharedObject.setValue(value);
        });

        readerThread.start();
        writerThread.start();
    }
}

Dans le code ci-dessus, la communication entre les threads est réalisée via un objet partagésharedObject. Le thread readerThread attend que la valeur soit prête avant de lire la valeur, et le thread writeThread définit la valeur de la valeur. Lorsque la valeur est prête, le thread readerThread est réveillé et lit la valeur de la valeur.

Grâce à l'analyse ci-dessus des transitions d'état des threads et de la communication inter-thread, nous pouvons mieux comprendre et utiliser la programmation multithread Java. Dans le même temps, nous devons prêter attention aux mécanismes de synchronisation et de verrouillage dans la programmation multithread, ainsi qu'éviter les blocages et les problèmes de sécurité des threads. Une utilisation raisonnable de la technologie multithread peut mieux améliorer les performances du programme et la vitesse de réponse.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn