Lorsque nous exécutons une application du monde réel, nous utilisons de bons processeurs pour une exécution plus rapide. Cependant, la vitesse du processeur seul ne peut pas rendre votre application plus rapide. L’une des meilleures façons de créer une application performante est d’utiliser le multithreading.
Qu’est-ce que le multithreading ?
Le multithreading est un concept de programmation dans lequel l’application peut créer de petites unités de tâches à exécuter en parallèle. Si vous travaillez sur un ordinateur, il exécute plusieurs applications et alloue de la puissance de traitement à celles-ci. Un programme simple s’exécute séquentiellement et les instructions du code s’exécutent les unes après les autres. Il s’agit d’une application à un seul thread. Mais si le langage de programmation prend en charge la création de plusieurs threads et les transmet au système d’exploitation pour qu’ils s’exécutent en parallèle, on parle de multithreading.
Multithreading vs Multiprocessing
Lorsque nous parlons de multithreading, cela n’a pas d’importance si la machine dispose d’un processeur à 2 cœurs ou à 16 cœurs. Notre travail consiste à créer une application multithreadée et laisser le système d’exploitation gérer l’allocation et l’exécution. En bref, le multithreading n’a rien à voir avec le multiprocessing.
Comment Java prend-il en charge le multithreading ?
Java offre un excellent support pour les applications multithreadées. Java prend en charge le multithreading à travers la classe Thread. La classe Thread Java nous permet de créer un processus léger qui exécute certaines tâches. Nous pouvons créer plusieurs threads dans notre programme et les démarrer. Le runtime Java se chargera de créer des instructions au niveau de la machine et de travailler avec le système d’exploitation pour les exécuter en parallèle.
Quels sont les différents types de threads ?
Il existe deux types de threads dans une application – le thread utilisateur et le thread daemon. Lorsque nous démarrons une application, le main est le premier thread utilisateur créé. Nous pouvons créer plusieurs threads utilisateur ainsi que des threads daemon. Lorsque tous les threads utilisateur sont exécutés, la JVM termine le programme.
Qu’est-ce que la priorité de thread ?
Lorsque nous créons un thread, nous pouvons lui assigner une priorité. Nous pouvons attribuer différentes priorités à différents threads, mais cela ne garantit pas qu’un thread de priorité supérieure s’exécutera avant un thread de priorité inférieure. Le planificateur de threads fait partie de l’implémentation du système d’exploitation et lorsque qu’un thread est démarré, son exécution est contrôlée par le planificateur de threads et la JVM n’a aucun contrôle sur son exécution.
Comment Créer un Thread en Java?
Nous pouvons créer des threads en implémentant l’interface Runnable ou en étendant la classe Thread.
Thread t = new Thread(new Runnable(){
@Override
public void run() {
}
});
La ligne ci-dessus permet de créer un nouveau thread en une seule instruction. Ici, nous créons une classe anonyme en tant que Runnable. Si vous connaissez les expressions lambda, nous pouvons créer un thread avec un code beaucoup plus court.
Runnable runnable = () -> System.out.println("Hello");
Une fois que nous avons créé un thread, nous devons démarrer son exécution en appelant la méthode start().
runnable.start();
I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.
1. Thread et Runnable en Java
Ceci est le premier article sur la classe Thread et l’interface Runnable. Vous apprendrez également sur les Process et les Threads. Quelle est la différence entre Thread et Process ? Les avantages de l’utilisation des Threads et comment créer des Threads en utilisant l’interface Runnable et la classe Thread. Cet article compare également l’interface Runnable avec la classe Thread.
2. Java Thread Sleep
Java Thread sleep est utilisé pour mettre en pause l’exécution du thread actuel. Nous utiliserons Thread sleep de manière extensive dans les futurs articles, il est donc bon de savoir comment cela fonctionne et si c’est précis ou non?
3. Java Thread Join
Parfois, nous devons attendre que d’autres threads terminent leur exécution avant de pouvoir continuer. Nous pouvons y parvenir en utilisant la méthode Thread join, apprenez comment cela fonctionne et quand l’utiliser.
4. États des threads Java
Comprendre les différents états d’un thread est important. Apprenez comment un thread change d’état et comment le planificateur de threads du système d’exploitation change l’état d’un thread.
5. Java Thread wait, notify et notifyAll
La classe Object de Java contient trois méthodes pour communiquer l’état de verrouillage d’une ressource. Apprenez avec un exemple l’utilisation de ces méthodes de la classe Object dans une simple implémentation Wait-Notify.
6. Sécurité des threads et synchronisation
Nous savons que les threads partagent des ressources d’objet, ce qui peut entraîner une corruption des données car ces opérations ne sont pas atomiques. Apprenez comment nous pouvons assurer la sécurité des threads en Java en utilisant différentes méthodes. Lisez cet article pour comprendre l’utilisation correcte de la synchronisation, des méthodes synchronisées et des blocs synchronisés.
7. Exception Java dans le thread principal
La JVM crée le premier thread en utilisant la méthode main. Cet article explique certaines exceptions courantes que nous rencontrons dans la vie quotidienne, leur cause première et comment les résoudre.
8. Sécurité du fil dans la classe Singleton
Dans cet article, vous apprendrez les concepts de base de la création d’une classe Singleton. Quels sont les problèmes de sécurité des threads avec différentes implémentations? Comment pouvons-nous assurer la sécurité des threads dans une classe Singleton.
9. Thread Daemon en Java
A simple article explaining daemon threads and how we can create daemon threads in java.
10. Thread Local Java
Nous savons que les threads partagent les variables d’objet, mais que se passe-t-il si nous voulons avoir des variables spécifiques à chaque thread créées au niveau de la classe ? Java fournit la classe utilitaire ThreadLocal pour créer des variables spécifiques à chaque thread. Lisez la suite pour en savoir plus sur la création de variables ThreadLocal dans un programme Java.
11. Java Thread Dump
Le thread dump Java fournit des informations sur le thread actuel. Un thread dump est utile pour analyser les problèmes de performance de l’application. Vous pouvez utiliser un thread dump pour trouver et résoudre des situations de blocage. Cet article explique les différentes méthodes pouvant être utilisées pour générer des thread dumps en Java.
12. Comment analyser les blocages en Java
Un deadlock est une situation où plusieurs threads attendent que les uns les autres libèrent des ressources, créant une dépendance cyclique. Cet article discute de la situation dans laquelle un deadlock peut survenir dans un programme Java. Comment pouvons-nous utiliser un dump de thread pour trouver le deadlock et quelles sont les meilleures pratiques pour éviter les deadlocks dans les programmes Java.
13. Thread Timer Java
Cet article explique comment utiliser les classes Java Timer et TimerTask pour créer des tâches à exécuter à intervalles réguliers, un exemple de programme montrant son utilisation, et comment annuler le timer.
14. Problème du Producteur-Consommateur Java
Avant Java 5, le problème du producteur-consommateur pouvait être résolu en utilisant les méthodes wait() et notify(), mais l’introduction de BlockingQueue l’a rendu très simple. Apprenez comment utiliser BlockingQueue pour résoudre le problème du producteur-consommateur en Java.
15. Java Thread Pool
Le pool de threads Java est une collection de threads travailleurs en attente de traiter des tâches. L’introduction de Java 5 du framework Executor a rendu très facile la création d’un pool de threads en Java. Nous pouvons utiliser les classes Executors et ThreadPoolExecutor pour créer et gérer un pool de threads.
16. Java Callable Future
Parfois, nous voulons que notre thread renvoie des valeurs que nous pouvons utiliser. Java 5 Callable peut être utilisé dans ce cas, ce qui est similaire à l’interface Runnable. Nous pouvons utiliser le framework Executor pour exécuter des tâches Callable.
17. Exemple de FutureTask Java
La classe FutureTask est la classe concrète de base qui implémente l’interface Future. Nous l’utilisons avec une implémentation Callable et Executors pour le traitement asynchrone. La classe FutureTask fournit des méthodes d’implémentation pour vérifier l’état de la tâche et renvoyer la valeur au programme appelant une fois que son traitement est terminé. Cela s’avère utile lorsque vous souhaitez remplacer certaines des méthodes d’implémentation de l’interface Future.
Conclusion
La programmation multithread est un sujet très vaste et écrire tout à son sujet dans un seul article n’aurait pas été possible. Si vous parcourez les articles ci-dessus dans l’ordre, vous apprendrez tout sur la programmation multithread en Java.
Source:
https://www.digitalocean.com/community/tutorials/multithreading-in-java