Vous êtes sur la page 1sur 6

Université Tunis El-Manar, Fac.

des Sciences de Tunis Année Universitaire : 2023 - 2024


Enseignante : Rim DRIDI Section : IOT2

TP1: Thread / Multithreading


Rappel

Qu’est-ce qu’un processus ?


Un processus est un programme en cours d'exécution par un ordinateur. De façon plus précise,
il peut être défini comme :

• Un ensemble d'instructions à exécuter, pouvant être dans la mémoire morte, mais le plus
souvent chargé depuis la mémoire de masse vers la mémoire vive.
Qu'est-ce qu'un thread ?
Un thread ou fil (d'exécution) ou tâche (autres appellations connues : processus léger, fil
d'instruction, processus allégé ou unité de traitement) est similaire à un processus car tous deux
représentent l'exécution d'un ensemble d'instructions du langage machine d'un processeur. Du
point de vue de l'utilisateur, ces exécutions semblent se dérouler en parallèle. Toutefois, là où
chaque processus possède sa propre mémoire virtuelle, les threads d'un même processus se
partagent sa mémoire virtuelle. Par contre, tous les threads possèdent leur propre piled’appel.
Un programme Java en cours d'exécution lance trois threads :

Lors de la création d'un nouveau thread, la JVM alloue un espace mémoire qui lui est dédié
nommé pile.

La pile d'un thread est un espace de mémoire réservée au thread pour stocker et gérer les
informations relatives à l'invocation des différentes méthodes effectuée par les traitements du
thread. Chaque invocation d'une méthode ajoute une entrée dans la pile qui contient entre autres
une référence sur la méthode et ses paramètres.

C'est la raison pour laquelle la taille de la pile doit être suffisamment importante pour stocker
les différentes invocations d'une méthode notamment si elle est invoquée de manière récursive
et que ce nombre d'appels est important. La pile permet de garder une trace des invocations
successives de méthodes.

1
Voici un petit schéma qui résume tout ceci :

Un thread peut avoir plusieurs états et, selon l'état d'un thread, il sera ou non traité par le
système. Voici la liste de ces différents états ainsi que leurs codes utilisés dans le langage Java
(que vous pouvez trouver avec la méthode getState()) :

État Description
C'est le statut que prend un thread lorsque vous le créez,
en faisant new Thread(…). À ce moment, le thread n'est
Nouveau (NEW) pas encore en cours d'exécution, il faudra invoquer la
méthode start() pour que celui-ci passe dans l'état
exécutable.

Lorsque vous invoquez la méthode start(), votre thread


Exécutable (RUNNABLE) passe dans l'état exécutable. À compter de ce moment,
votre thread est prêt à travailler.

Vous pouvez voir qu'un thread peu être considéré


comme bloqué (on dit aussi en attente) pour plusieurs
raisons.

Bloqué • WAITING : lorsqu'un thread attend indéfiniment


un résultat ;
(BLOCKED,TIMED_WAITING • TIME_WAITING : lorsqu'un thread est mis en
ou WAITING) pause, via la méthode sleep() par exemple ;
• BLOCKED : lorsqu'un thread tente d'accéder à une
ressource (variable, fichier ou autre) verrouillée par
un autre thread.

Terminé Un thread prend l'état terminé lorsqu'il a effectué toutes


(TERMINATED) ses tâches. On dit aussi qu'il est « mort ». Vous ne
pouvez alors plus le relancer par la méthode start().

2
Voici un petit schéma qui représente les différents états d'un thread au cours de sa vie :

Exemple 1 :

Écrivons un premier thread par extension de la classe Thread (package java.lang). Nous
devons surcharger une seule méthode : la méthode run(), qui retourne void, et ne prend aucun
paramètre.

Premier thread par extension de la classe Thread

Lancer un thread signifie demander à la machine Java d'exécuter cette classe dans un fil
d'exécution particulier. Il est possible d'hériter de la classe Thread et de redéfinir la méthode
run().Par convention, le code exécuté dans ce fil est le code écrit dans la méthode run() de
ce thread.

Lancement d'un premier thread

Le lancement d'un nouveau thread se fait par appel à la méthode start() de l'instance
de Thread que l'on veut exécuter. L'appel à cette méthode start() a pour effet de créer un

3
nouveau fil d'exécution dans la machine Java. Ce fil d'exécution va exécuter la
méthode run() de cet objet. C'est pourquoi l'on surcharge cette méthode.

Exemple 2 :

Interpréter le code suivant :

Résultat affiché :

On souhaite endormir un thread pendant un délai aléatoire. On réécrit la méthode run().

4
Résultat possible :

5
Exemple 3 :

Un "compteur" a un nom (Toto par exemple) et il compte de 1 à n (nombre entier positif


quelconque). Il marque une pause aléatoire entre chaque nombre (de 0 à 5000 millisecondes
par exemple).Un compteur affiche chaque nombre (Toto affichera par exemple, "Toto : 3") et
il affiche un message du type "*** Toto a fini de compter jusqu'à 10" quand il a fini.

Ecrivez la classe compteur et testez-la en lançant plusieurs compteurs qui comptent jusqu'à 10.
Voyez celui qui a fini le plus vite.

Vous aimerez peut-être aussi