12.1Introduction aux threads
12.1.1 â Qu'est-ce qu'un thread ?
Un thread (fil d'exécution) est une unité d'exécution indépendante dans un programme Java. Un programme peut avoir plusieurs threads qui s'exécutent simultanément, permettant ainsi d'effectuer plusieurs tùches en parallÚle.
đ Concept fondamental
Par défaut, un programme Java s'exécute dans un seul thread (le thread principal ou "main thread"). Cependant, vous pouvez créer plusieurs threads pour exécuter différentes parties de votre code simultanément.
- Programme séquentiel : Comme un cuisinier qui fait une tùche à la fois (préparer les légumes, puis cuire, puis servir)
- Programme multi-thread : Comme plusieurs cuisiniers travaillant en parallÚle (un prépare les légumes pendant qu'un autre cuit la viande)
đ» Exemple : Programme sĂ©quentiel vs Multi-thread
Programme séquentiel (un seul thread)
public class ProgrammeSequentiel {
public static void main(String[] args) {
// TĂąche 1
for (int i = 1; i <= 5; i++) {
System.out.println("TĂąche 1 : " + i);
try {
Thread.sleep(1000); // Pause de 1 seconde
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// Tùche 2 (attend que la tùche 1 soit terminée)
for (int i = 1; i <= 5; i++) {
System.out.println("TĂąche 2 : " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// Résultat : Tùche 1 complÚte, puis Tùche 2 complÚte (séquentiel)
Programme multi-thread
public class ProgrammeMultiThread {
public static void main(String[] args) {
// Créer et démarrer le thread 1
Thread thread1 = new Thread(() -> {
for (int i = 1; i <= 5; i++) {
System.out.println("TĂąche 1 : " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// Créer et démarrer le thread 2
Thread thread2 = new Thread(() -> {
for (int i = 1; i <= 5; i++) {
System.out.println("TĂąche 2 : " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread1.start(); // Démarrer le thread 1
thread2.start(); // Démarrer le thread 2
// Les deux threads s'exécutent en parallÚle
}
}
// Résultat : Les tùches 1 et 2 s'exécutent simultanément (mélangées)
- Séquentiel : Les tùches s'exécutent une aprÚs l'autre (total : ~10 secondes)
- Multi-thread : Les tùches s'exécutent en parallÚle (total : ~5 secondes)
- Dans le programme multi-thread, les messages des deux threads peuvent ĂȘtre mĂ©langĂ©s car ils s'exĂ©cutent simultanĂ©ment
đŻ Avantages des threads
- Performance : Utilisation efficace des processeurs multi-cĆurs
- Réactivité : Interface utilisateur qui reste réactive pendant les opérations longues
- Parallélisme : Traitement simultané de plusieurs tùches
- Efficacité : Meilleure utilisation des ressources systÚme
â ïž DĂ©fis des threads
- Synchronisation : Gérer l'accÚs concurrent aux ressources partagées
- Race conditions : ProblĂšmes quand plusieurs threads modifient la mĂȘme variable
- Deadlocks : Blocage mutuel entre threads
- Complexité : Plus difficile à déboguer qu'un programme séquentiel
12.1.2 â Thread principal (Main Thread)
Chaque programme Java démarre avec au moins un thread : le thread principal (main thread). C'est ce thread qui exécute la méthode main().
đ Identifier le thread principal
public class ThreadPrincipal {
public static void main(String[] args) {
// Obtenir une référence au thread actuel
Thread threadActuel = Thread.currentThread();
// Afficher les informations du thread
System.out.println("Nom du thread : " + threadActuel.getName());
System.out.println("ID du thread : " + threadActuel.getId());
System.out.println("Priorité : " + threadActuel.getPriority());
System.out.println("Ătat : " + threadActuel.getState());
// Le thread principal s'appelle "main"
// Affiche : Nom du thread : main
}
}
- Nom :
"main" - Priorité :
5(prioritĂ© normale par dĂ©faut) - Ătat :
RUNNABLEquand il s'exécute - Démarre automatiquement avec l'exécution du programme
đ Ătats d'un thread
Un thread peut ĂȘtre dans diffĂ©rents Ă©tats pendant son cycle de vie :
- NEW : Thread créé mais pas encore démarré
- RUNNABLE : Thread exĂ©cutable (en cours d'exĂ©cution ou prĂȘt Ă ĂȘtre exĂ©cutĂ©)
- BLOCKED : Thread bloqué en attendant un verrou (lock)
- WAITING : Thread en attente indéfinie
- TIMED_WAITING : Thread en attente avec un délai
- TERMINATED : Thread terminé
Thread thread = new Thread(() -> {
System.out.println("Thread en cours d'exécution");
});
System.out.println("Ătat avant start() : " + thread.getState()); // NEW
thread.start();
System.out.println("Ătat aprĂšs start() : " + thread.getState()); // RUNNABLE
// Attendre que le thread se termine
try {
thread.join();
System.out.println("Ătat aprĂšs join() : " + thread.getState()); // TERMINATED
} catch (InterruptedException e) {
e.printStackTrace();
}
12.1.3 â Cas d'usage des threads
Les threads sont utilisés dans de nombreux contextes pour améliorer les performances et la réactivité des applications.
đ Applications web
Les serveurs web gĂšrent plusieurs requĂȘtes simultanĂ©ment, chaque requĂȘte Ă©tant traitĂ©e dans un thread sĂ©parĂ©.
đź Applications graphiques
Les interfaces utilisateur utilisent des threads pour rester réactives pendant les opérations longues.
// Exemple conceptuel : Interface utilisateur
// Thread 1 : Interface utilisateur (reste réactive)
// Thread 2 : Calculs lourds en arriĂšre-plan
// Sans threads : L'interface se fige pendant les calculs
// Avec threads : L'interface reste réactive pendant les calculs
đ Traitement de donnĂ©es
Le traitement parallĂšle de grandes quantitĂ©s de donnĂ©es peut ĂȘtre accĂ©lĂ©rĂ© en divisant le travail entre plusieurs threads.
đ TĂąches pĂ©riodiques
Les threads peuvent ĂȘtre utilisĂ©s pour exĂ©cuter des tĂąches pĂ©riodiques (sauvegardes automatiques, nettoyage, etc.).
đĄ Points clĂ©s Ă retenir
- Thread : Unité d'exécution indépendante
- Thread principal : Exécute la méthode main()
- Multi-threading : Exécution simultanée de plusieurs threads
- Avantages : Performance, réactivité, parallélisme
- Défis : Synchronisation, race conditions, complexité
- Ătats : NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED