26 août 2016

Multithreading en Java : introduction

Design & Code

Ahmed

Ellouze

Image ordinateur et code.

26 août 2016

Multithreading en Java : introduction

Design & Code

Ahmed

Ellouze

Image ordinateur et code.

26 août 2016

Multithreading en Java : introduction

Design & Code

Ahmed

Ellouze

Image ordinateur et code.

Vous souhaitez améliorer la performance et la responsivité de vos applications et tirer profit au maximum des processeurs de vos machines ? Ces objectifs pourraient être atteints grâce au multithreading qui permet d’exécuter plusieurs tâches en parallèle.

Cet article d’introduction est le premier d’une série d’articles qui visent à expliquer le Framework de multithreading en java en partant des notions les plus basiques jusqu’à aborder des thématiques plus avancées.

I. Qu’est-ce que le multithreading ?

Un thread pourrait être défini comme process léger ou une unité d’exécution d’un programme.

Tous les programmes Java ont au moins un thread, connu sous le nom de « thread principal », qui est créé par la Java Virtual Machine (JVM) au début du programme, lorsque la méthode « main() » est appelée.

Un programme multithread dispose de plusieurs threads qui lui permettent de fonctionner plus efficacement en exécutant plusieurs tâches simultanément (plusieurs unités d’exécution).

II. Différence entre un Thread et un process

Les process et les threads sont très similaires, ce qui crée de la confusion pour comprendre les différences entre les deux. Le process et le thread sont une séquence d’exécution, mais les deux sont différents de manière que les process s’exécutent dans des espaces mémoire différents et indépendants, tandis que les threads (du même programme) s’exécutent dans un espace mémoire partagé.

Par conséquent, une mauvaise gestion de la mémoire partagée entre les threads peut entraîner des résultats erronés du programme. Ceci est dû au fait que la mémoire (notamment les variables du programme) est partagée entre les différents threads.

III. Multithreading, parallélisme et concurrence

Le Multithreading est essentiellement applicable lorsque nous parlons d'un minimum de deux threads ou plus. Lorsqu'une application est capable d'exécuter au moins deux tâches pratiquement en même temps en utilisant deux threads ou plus alors on est en train de faire du multithreading. Bien que, dans ce cas, les tâches semblent s'exécuter simultanément, mais ce n’est pas forcément le cas. Ils tirent probablement parti de la fonction de découpage du temps CPU (CPU time-slicing) du système d'exploitation où le processeur exécute une partie d’une tâche qui passe par la suite à l'état d'attente. Lorsque la première tâche est dans l'état d'attente, la CPU est affectée à une autre tâche. Le système d'exploitation attribue ainsi le processeur et d'autres ressources informatiques, par exemple la mémoire à tour de rôle à toutes les tâches. C'est ce qu'on appelle la concurrence.

Pour l'utilisateur final, toutes les tâches semblent s'exécuter en parallèle.

Le parallélisme quant à lui exécute physiquement des parties de tâches ou plusieurs tâches, en même temps en utilisant l'infrastructure multiprocesseur ou multi-cœur du CPU, en attribuant une unité d’exécution physique à chaque tâche.

Le parallélisme nécessite alors du matériel avec plusieurs unités de traitement (plusieurs processeurs ou un processeur multi-cœur).

IV. Les modèles en multithreading

1. Concurrent non parallèle

Une application peut être concurrente mais pas parallèle, ce qui signifie qu'elle traite plus d'une tâche en même temps, mais qu'aucune tâche ne s'exécute réellement en même temps (CPU time-slicing).

2. Parallèle non concurrent

Une application peut être parallèle mais pas concurrente, ce qui signifie qu'elle traite plusieurs tâches dans un processeur multi-cœur en même temps (une tâche par cœur).

3. Non parallèle non concurrent

Une application peut ne pas être parallèle ni concurrente, ce qui signifie qu'elle traite toutes les tâches une par une, de manière séquentielle.

4. Parallèle concurrent

Une application peut être parallèle et concurrente à la fois. Cela veut dire qu'elle traite plusieurs tâches en même temps dans un processeur multi-cœur (plusieurs tâches par cœur).

V. Utilisations et avantages

A. Améliorer les performances sur les machines multiprocesseurs

De nos jours, la plupart des ordinateurs offrent plusieurs processeurs ou un processeur à plusieurs cœurs. Dans ce cas, chaque processeur peut exécuter un thread différent dans une application multithread. Ainsi, les tâches de l'application peuvent vraiment s'exécuter en parallèle, ce qui augmente les performances d'ensemble du système.

B. Diminuer le temps IDLE

Pour mieux comprendre ce que c’est, Imaginez qu’on est sur une application mono-thread (thread principal). Il y a deux choses que l'utilisateur veut faire.

1) Téléchargez un fichier puis le traiter (disons que le téléchargement prend 10 secondes pour obtenir une connexion réseau, 5 secondes pour récupérer le fichier à travers le réseau et 30 secondes pour le traiter).

2) Copiez un autre fichier d'un dossier à un autre (disons que la copie du fichier prend 3 secondes).

Lorsque le thread attend 10 secondes pour obtenir une connexion réseau, rien n'est fait jusqu'à ce qu'il obtienne réellement la connexion. Ainsi, le processeur n'est pas utilisé pendant les 10 secondes. Le temps qui correspond au repos du processeur est appelé IDLE time.

Maintenant, s'il y avait un autre thread, alors ce thread aurait pu être utilisé pour la copie de fichier de 3 secondes lorsque le premier thread attend 10 secondes pour obtenir une connexion réseau. Le multithreading permet alors de diminuer le temps IDLE et améliorer ainsi la performance du programme.

C. Réactivité de l’application

Il augmente la réactivité à l’utilisateur car il permet au programme de continuer à s’exécuter même si une partie de celui-ci effectue une longue opération ou est bloquée.

L’exemple le plus courant est les traitements lancés en cliquant sur un bouton d’une interface graphique. Pour éviter un blocage de l’interface graphique, il faut que le traitement soit lancé dans un thread séparé et non pas dans le thread principal. Sinon l’interface graphique reste gelée jusqu’à la fin du traitement.

VI. Conclusion

Cet article est une introduction théorique au multithreading. Dans l’article suivant on va pouvoir manipuler des threads avec du code JAVA. On va apprendre comment créer des threads, les lancer et les faire communiquer entre eux.

A bientôt alors, en attendant rendez-vous sur notre blog !