Multithreading dans Java


Toute application peut avoir plusieurs processus (instances). Chacun de ces processus peut รชtre affectรฉ soit ร  un seul thread, soit ร  plusieurs threads. Nous verrons dans ce tutoriel comment effectuer plusieurs tรขches en mรชme temps et en apprendrons รฉgalement plus sur les threads et la synchronisation entre les threads.

Quโ€™est-ce quโ€™un fil unique ?

Un seul fil dans Java est fondamentalement une unitรฉ de traitement lรฉgรจre et la plus petite. Java utilise des threads en utilisant une ยซ classe de thread ยป. Il existe deux types de threads : thread utilisateur et thread dรฉmon (les threads daemon sont utilisรฉs lorsque nous voulons nettoyer l'application et sont utilisรฉs en arriรจre-plan). Lorsqu'une application dรฉmarre pour la premiรจre fois, un thread utilisateur est crรฉรฉ. Aprรจs cela, nous pouvons crรฉer de nombreux threads utilisateur et threads dรฉmon.

Exemple de thread unique :

package demotest;

public class GuruThread
{
       public static void main(String[] args) {
              System.out.println("Single Thread");
       }
}

Avantages du fil unique :

  • Rรฉduit la surcharge de l'application car un seul thread s'exรฉcute dans le systรจme
  • Cela rรฉduit รฉgalement le coรปt de maintenance de lโ€™application.

Quโ€™est-ce que le multithreading Java?

multithreading in Java est un processus d'exรฉcution simultanรฉe de deux ou plusieurs threads pour une utilisation maximale du processeur. Les applications multithread exรฉcutent deux ou plusieurs threads exรฉcutรฉs simultanรฉment. Par consรฉquent, il est รฉgalement connu sous le nom de Concurrence dans Java. Chaque fil est parallรจle les uns aux autres. Plusieurs threads n'attribuent pas de zone mรฉmoire distincte, ils รฉconomisent donc de la mรฉmoire. De plus, le changement de contexte entre les threads prend moins de temps.

Exemple de multithread :

package demotest;
public class GuruThread1 implements Runnable
{
       public static void main(String[] args) {
        Thread guruThread1 = new Thread("Guru1");
        Thread guruThread2 = new Thread("Guru2");
        guruThread1.start();
        guruThread2.start();
        System.out.println("Thread names are following:");
        System.out.println(guruThread1.getName());
        System.out.println(guruThread2.getName());
    }
    @Override
    public void run() {
    }
}

Avantages du multithread :

  • Les utilisateurs ne sont pas bloquรฉs car les threads sont indรฉpendants et nous pouvons parfois effectuer plusieurs opรฉrations
  • En tant que tels, les threads sont indรฉpendants, les autres threads ne seront pas affectรฉs si un thread rencontre une exception.

Cycle de vie des threads en Java

Le cycle de vie d'un thread :

Cycle de vie des threads en Java
Cycle de vie des threads en Java

Il existe diffรฉrentes รฉtapes du cycle de vie du thread, comme le montre le diagramme ci-dessus :

  1. NOUVEAU
  2. Exรฉcutable
  3. Fonctionnement
  4. Attendre
  5. Mort
  1. Nouveau: Dans cette phase, le thread est crรฉรฉ ร  l'aide de la classe ยซ Thread class ยป. Il reste dans cet รฉtat jusqu'ร  ce que le programme dรฉparts le fil. Il est รฉgalement connu sous le nom de fil nรฉ.
  2. Exรฉcutable: Dans cette page, l'instance du thread est invoquรฉe avec une mรฉthode start. Le contrรดle du thread est donnรฉ au planificateur pour terminer l'exรฉcution. Cela dรฉpend du planificateur si le thread doit รชtre exรฉcutรฉ.
  3. Exรฉcution: Lorsque le thread commence ร  sโ€™exรฉcuter, lโ€™รฉtat passe ร  lโ€™รฉtat ยซ en cours dโ€™exรฉcution ยป. Le planificateur sรฉlectionne un thread dans le pool de threads et commence ร  s'exรฉcuter dans l'application.
  4. Attendre: C'est l'รฉtat dans lequel un thread doit attendre. Comme plusieurs threads sont en cours dโ€™exรฉcution dans lโ€™application, une synchronisation entre les threads est nรฉcessaire. Par consรฉquent, un thread doit attendre que lโ€™autre thread soit exรฉcutรฉ. Par consรฉquent, cet รฉtat est appelรฉ รฉtat dโ€™attente.
  5. Morte: C'est l'รฉtat dans lequel le thread est terminรฉ. Le thread est en cours dโ€™exรฉcution et dรจs quโ€™il a terminรฉ le traitement, il est dans ยซ lโ€™รฉtat mort ยป.


Mรฉthodes de multithreading dans Java

Certaines des mรฉthodes couramment utilisรฉes pour les threads sont :

Mรฉthode Description
dรฉmarrer() Cette mรฉthode dรฉmarre l'exรฉcution du thread et JVM appelle la mรฉthode run() sur le thread.
Sommeil (int millisecondes) Cette mรฉthode met le thread en veille, donc l'exรฉcution du thread s'arrรชtera pendant les millisecondes fournies et aprรจs cela, le thread recommencera ร  s'exรฉcuter. Cela aide ร  la synchronisation des threads.
getName () Il renvoie le nom du fil.
setPriority (int nouvelle prioritรฉ) Cela change la prioritรฉ du thread.
rendement () Cela provoque l'arrรชt du thread actuel et l'exรฉcution d'autres threads.

Exemple : Dans ce programme multithreading en Java Par exemple, nous allons crรฉer un thread et explorer les mรฉthodes intรฉgrรฉes disponibles pour les threads.

package demotest;
public class thread_example1 implements Runnable {
    @Override
    public void run() {
    }
    public static void main(String[] args) {
        Thread guruthread1 = new Thread();
        guruthread1.start();
        try {
            guruthread1.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        guruthread1.setPriority(1);
        int gurupriority = guruthread1.getPriority();
        System.out.println(gurupriority);
        System.out.println("Thread Running");
  }
}

Explication du code :

  • Ligne de code 2 : Nous crรฉons une classe ยซ thread_Example1 ยป qui implรฉmente l'interface Runnable (elle doit รชtre implรฉmentรฉe par toute classe dont les instances sont destinรฉes ร  รชtre exรฉcutรฉes par le thread.)
  • Ligne de code 4 : Il remplace la mรฉthode run de l'interface exรฉcutable car il est obligatoire de remplacer cette mรฉthode
  • Ligne de code 6 : Ici, nous avons dรฉfini la mรฉthode principale dans laquelle nous allons dรฉmarrer l'exรฉcution du thread.
  • Ligne de code 7 : Ici, nous crรฉons un nouveau nom de thread sous le nom ยซ guruthread1 ยป en instanciant une nouvelle classe de thread.
  • Ligne de code 8 : nous utiliserons la mรฉthode ยซ start ยป du thread en utilisant lโ€™instance ยซ guruthread1 ยป. Ici, le thread commencera ร  s'exรฉcuter.
  • Ligne de code 10 : Ici, nous utilisons la mรฉthode ยซ sleep ยป du thread en utilisant l'instance ยซ guruthread1 ยป. Par consรฉquent, le thread va dormir pendant 1000 millisecondes.
  • Codes 9-14 : Ici, nous avons placรฉ la mรฉthode sleep dans le bloc try catch car il y a une exception vรฉrifiรฉe qui se produit, c'est-ร -dire une exception interrompue.
  • Ligne de code 15 : Ici, nous dรฉfinissons la prioritรฉ du thread sur 1, quelle que soit la prioritรฉ.
  • Ligne de code 16 : Ici, nous obtenons la prioritรฉ du thread en utilisant getPriority()
  • Ligne de code 17 : Ici, nous imprimons la valeur extraite de getPriority
  • Ligne de code 18 : Ici, nous รฉcrivons un texte que le fil est en cours d'exรฉcution.

Lorsque vous exรฉcutez le code ci-dessus, vous obtenez le rรฉsultat suivant :

Exemple de fil de discussion dans Java

Sortie :

5 est la prioritรฉ du Thread et Thread Running est le texte qui est la sortie de notre code.

Java Fil ร  coudre Synchronisation

En multithreading, les programmes ont un comportement asynchrone. Si un thread รฉcrit des donnรฉes et qu'un autre thread lit des donnรฉes en mรชme temps, cela peut crรฉer une incohรฉrence dans l'application. Lorsqu'il est nรฉcessaire d'accรฉder aux ressources partagรฉes par deux ou plusieurs threads, l'approche de synchronisation est utilisรฉe. Java a fourni des mรฉthodes synchronisรฉes pour implรฉmenter un comportement synchronisรฉ.

Dans cette approche, une fois que le thread atteint l'intรฉrieur du bloc synchronisรฉ, aucun autre thread ne peut appeler cette mรฉthode sur le mรชme objet. Tous les threads doivent attendre que ce thread termine le bloc synchronisรฉ et en sorte. De cette faรงon, la synchronisation est utile dans une application multithread. Un thread doit attendre que l'autre thread termine son exรฉcution, puis les autres threads sont autorisรฉs ร  s'exรฉcuter.

Il peut s'รฉcrire sous la forme suivante :

Synchronized(object)
{  
        //Block of statements to be synchronized
}

Multithreading dans Java Exemples de programmes

Dans ce multithreading Java Par exemple, nous prendrons deux threads et rรฉcupรฉrerons les noms du thread.

Exemple1:

GuruThread1.java
package demotest;
public class GuruThread1 implements Runnable{

    /**
     * @param args
     */
    public static void main(String[] args) {
        Thread guruThread1 = new Thread("Guru1");
        Thread guruThread2 = new Thread("Guru2");
        guruThread1.start();
        guruThread2.start();
        System.out.println("Thread names are following:");
        System.out.println(guruThread1.getName());
        System.out.println(guruThread2.getName());
    }
    @Override
    public void run() {
    }
}

Explication du code :

  • Ligne de code 3 : Nous avons pris une classe ยซ GuruThread1 ยป qui implรฉmente Runnable (elle doit รชtre implรฉmentรฉe par toute classe dont les instances sont destinรฉes ร  รชtre exรฉcutรฉes par le thread.)
  • Ligne de code 8 : C'est la mรฉthode principale de la classe
  • Ligne de code 9 : Ici, nous instancions la classe Thread, crรฉons une instance nommรฉe ยซ guruThread1 ยป et crรฉons un thread.
  • Ligne de code 10 : Ici, nous instancions la classe Thread, crรฉons une instance nommรฉe ยซ guruThread2 ยป et crรฉons un thread.
  • Ligne de code 11 : Nous commenรงons le fil de discussion, c'est-ร -dire guruThread1.
  • Ligne de code 12 : Nous commenรงons le fil de discussion, c'est-ร -dire guruThread2.
  • Ligne de code 13 : Afficher le texte sous la forme ยซ Les noms des fils de discussion sont les suivants : ยป
  • Ligne de code 14 : Obtenir le nom du thread 1 en utilisant la mรฉthode getName() de la classe thread.
  • Ligne de code 15 : Obtenir le nom du thread 2 en utilisant la mรฉthode getName() de la classe thread.

Lorsque vous exรฉcutez le code ci-dessus, vous obtenez le rรฉsultat suivant :

Java Exemple de multithreading

Sortie :

Les noms de threads sont affichรฉs ici sous la forme

  • Guru1
  • Guru2

Exemple 2:

Dans ce multithreading dans Java Par exemple, nous allons apprendre ร  remplacer les mรฉthodes run() et start() d'une interface exรฉcutable, crรฉer deux threads de cette classe et les exรฉcuter en consรฉquence.

De plus, nous suivons deux cours,

  • Celui qui implรฉmentera l'interface exรฉcutable et
  • Un autre qui aura la mรฉthode main et sโ€™exรฉcutera en consรฉquence.
package demotest;
public class GuruThread2 {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  GuruThread3 threadguru1 = new GuruThread3("guru1");
  threadguru1.start();
  GuruThread3 threadguru2 = new GuruThread3("guru2");
  threadguru2.start();
 }
}
class GuruThread3 implements Runnable {
 Thread guruthread;
 private String guruname;
 GuruThread3(String name) {
  guruname = name;
 }
 @Override
 public void run() {
  System.out.println("Thread running" + guruname);
  for (int i = 0; i < 4; i++) {
   System.out.println(i);
   System.out.println(guruname);
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    System.out.println("Thread has been interrupted");
   }
  }
 }
 public void start() {
  System.out.println("Thread started");
  if (guruthread == null) {
   guruthread = new Thread(this, guruname);
   guruthread.start();
  }
 }
}

Explication du code :

  • Ligne de code 2 : Ici, nous prenons une classe ยซ GuruThread2 ยป qui contiendra la mรฉthode principale.
  • Ligne de code 4 : Ici, nous prenons une mรฉthode principale de la classe.
  • Ligne de code 6-7 : Ici, nous crรฉons une instance de la classe GuruThread3 (qui est crรฉรฉe dans les lignes ci-dessous du code) sous le nom de ยซ threadguru1 ยป et nous dรฉmarrons le fil de discussion.
  • Ligne de code 8-9 : Ici, nous crรฉons une autre instance de la classe GuruThread3 (qui est crรฉรฉe dans les lignes ci-dessous du code) sous le nom de ยซ threadguru2 ยป et nous dรฉmarrons le fil de discussion.
  • Ligne de code 11 : Ici, nous crรฉons une classe ยซ GuruThread3 ยป qui implรฉmente l'interface exรฉcutable (elle doit รชtre implรฉmentรฉe par toute classe dont les instances sont destinรฉes ร  รชtre exรฉcutรฉes par le thread.)
  • Ligne de code 13-14 : nous prenons deux variables de classe dont lโ€™une est de type thread class et lโ€™autre de type string.
  • Ligne de code 15-18 : nous remplaรงons le constructeur GuruThread3, qui prend un argument comme type de chaรฎne (qui est le nom du thread) qui est attribuรฉ ร  la variable de classe guruname et donc le nom du thread est stockรฉ.
  • Ligne de code 20 : Ici, nous remplaรงons la mรฉthode run() de l'interface exรฉcutable.
  • Ligne de code 21 : Nous gรฉnรฉrons le nom du thread ร  l'aide de l'instruction println.
  • Ligne de code 22-31 : Ici, nous utilisons une boucle for avec un compteur initialisรฉ ร  0, et il ne doit pas รชtre infรฉrieur ร  4 (nous pouvons prendre n'importe quel nombre donc ici la boucle s'exรฉcutera 4 fois) et incrรฉmentons le compteur. Nous imprimons le nom du thread et le faisons รฉgalement dormir pendant 1000 millisecondes dans un bloc try-catch car la mรฉthode sleep a dรฉclenchรฉ une exception vรฉrifiรฉe.
  • Ligne de code 33 : Ici, nous remplaรงons la mรฉthode de dรฉmarrage de l'interface exรฉcutable.
  • Ligne de code 35 : Nous affichons le texte ยซ Thread dรฉmarrรฉ ยป.
  • Ligne de code 36-40 : Ici, nous prenons une condition if pour vรฉrifier si la variable de classe guruthread a de la valeur ou non. S'il est nul, nous crรฉons une instance en utilisant une classe de thread qui prend le nom comme paramรจtre (dont la valeur a รฉtรฉ attribuรฉe dans le constructeur). Aprรจs quoi le thread est dรฉmarrรฉ ร  lโ€™aide de la mรฉthode start().

Lorsque vous exรฉcutez le code ci-dessus, vous obtenez le rรฉsultat suivant :

Exemple de multithreading dans Java

Sortie:

Il y a deux fils de discussion, nous recevons donc deux fois le message ยซ Thread dรฉmarrรฉ ยป.

Nous obtenons les noms des threads tels que nous les avons gรฉnรฉrรฉs.

Il entre dans la boucle for oรน nous imprimons le compteur et le nom du thread et le compteur commence par 0.

La boucle s'exรฉcute trois fois et entre les deux, le thread est mis en veille pendant 1000 millisecondes.

Par consรฉquent, d'abord, nous obtenons guru1 puis guru2 puis ร  nouveau guru2 parce que le thread dort ici pendant 1000 millisecondes, puis ensuite guru1 et encore guru1, le thread dort pendant 1000 millisecondes, donc nous obtenons guru2 puis guru1.

Rรฉsumรฉ

Dans ce tutoriel, nous avons vu des applications multithread dans Java et comment utiliser un seul et plusieurs threads dans Java.

  • Expliquer le multithreading dans Java:en multithreading, les utilisateurs ne sont pas bloquรฉs car les threads sont indรฉpendants et peuvent effectuer plusieurs opรฉrations ร  la fois
  • Les diffรฉrentes รฉtapes du cycle de vie du fil sont,
    • NOUVEAU
    • Exรฉcutable
    • Fonctionnement
    • Attendre
    • Mort
  • Nous avons รฉgalement appris synchronisation entre les threads, ce qui aide l'application ร  fonctionner correctement.
  • Programmation multithread dans Java facilite de nombreuses autres tรขches d'application.

Rรฉsumez cet article avec :