Ce document est destiné aux étudiants de l'Université Constantine 2 –Abdelhamid Mehri, Faculté des nouvelles technologies, Département du IFA, Master 1, RSD. Il couvre les notions suivantes:
- Programmation des threads en Java
- Comportement des programmes multi-threadés
- Synchronisation entre threads
- Communication inter-threads
Exercices TP Les Threads Concurrence Et Synchronisation
Télécharger PDFUniversité Constantine 2 –Abdelhamid Mehri
Faculté des nouvelles technologies
Département du IFA / Master 1 /RSD
TP N°1 : Les Threads , Concurrence Et Synchronisation
Objectif : Le but de ce premier TP est de se familiariser avec la programmation des threads en Java, observer le comportement des programmes à activités parallèles (multi-threadés), montrer le besoin en synchronisation entre threads ainsi que la communication inter-threads.
M Lounes Bessalah
Matière D.A.R.E 2020-2021
Outils (JRE + IDE JAVA)
Exercice N°1 : Création des threads.
Exercice 1 (Voir série de TP 1 Création des threads):
- MonThread : classe JAVA qui hérite «extends» tout les propriétés de la classe Thread.
- run() : une redéfinition de la méthode abstraite run() qu’on a hérité de la classe mère Thread qui est elle-même hérité de l’interface Runnable.
- run() : possède dans son corps une suite d’instruction a exécuté.
1.1Compiler et exécuter le programme Afin d'exécuter le programme il faut implémenter la méthode public static void main(String args[]) sous le même paquet de votre projet.
La console :
return "Thread[" + getName() + "," + getPriority() + "," + group.getName() + "]";
Tostring() dans la classe Thread
return ‘’ Thread[" + getName() + "," + getPriority() + "," + group.getName() + "] ”;
« FIN » instruction 3 du main.
« i am thread » instruction 1 du run().
« Thread-0 » le nom de thread de l'instance courante de la classe Thread (Thread mort a ne pas confondre avec le thread en cours d’exécution), this.getName() ou getName() dans le run() font référence au nom du thread de l'instance Thread. Pour en savoir plus afficher this.isAlive() vous trouveriez que c’est un thread MORT.
«le courant thread Thread[MASTER RSD 18-19,5,main] » affiche l’identité du thread actif courant. Thread t = Thread.currentThread();
Le S.o.println(t) ; l’affichage de cet objet fait référence a la méthode toString() de la classe Thread . 5 est la priorité d’exécution par défaut comprise entre {1-10}
false le retour de la méthode isalive().
Attention isalive() ,this.isalive(),getpriority(),this.getpriority() dans le corps de run(): font référence au thread de l’instance Thread MORT et non pas au thread courant.
Le long chiffre c’est le temps actuel en millisecondes depuis 01 janvier 1970 afin de mieux l’exploiter on soustrait deux instances une au début et l’autre vers la fin, afin de voir le temps d’exécution du programme ‘TIC-TOC’
1.2 Classe VS Interface :
Remarque : la création par héritage à partir de la classe Thread est contraignante car elle empêche tout autre héritage (Java n’autorise pas l’héritage multiple). Cependant l’implémentation de l’interface Runnable offre la possibilité d’héritage et d’implémentation d’autres interfaces.
Les erreurs en rouges voir console de la partie 1.
1.3 Deux threads ou plus ? :
- Manque de synchronisation.
- Ordonnancement inexistante.
- Pas de priorités.
- Exécution Aléatoire des Trois threads concurrents. 3 ????
Exécutez dans le main(args) : System.out.println("Nombre de threads actives " + Thread.activeCount()
Exercice N°1
Exercice N°2 : Synchronisation & Communication entre threads.
Commentaires
a) Les threads p1 et p2 sont-ils synchronisés?
Non, l'exécution des deux threads est aléatoire par contre les deux groupés et le thread main est synchronisé
a) Expliquer le comportement du thread principal. Quel est le rôle de la méthode join().
Main en pause jusqu’à la fin des deux threads. Join() bloque le thread courant. Dans ce cas c’est le thread principal
Main T P2 P1
Producteur/Consommateur
Producteur/Consommateur
Console avant
1 .Bien que les méthodes prendre() et mettre() de FileAttente soient synchronisées, rien n’arrête ici le producteur de dépasser le consommateur et rien n’arrête non plus le consommateur de consommer la même valeur 2 fois.
Le moyen de corriger cela est d’utiliser wait() et notify() pour signaler dans les deux directions, donc la classe FileAttente deviendra :
Console après
Producteur/Consommateur
Producteur consommateur avec objet synchronisé à tampon de n cases. (voir les fichiers java Prodconso_n_semaphore)
Fin du premier TP.
🠶 Objectif : Le but de ce premier TP est de se familiariser avec la programmation des threads en Java, observer le comportement des programmes à activités parallèles (multi-threadés), montrer le besoin en synchronisation entre threads ainsi que la communication inter-threads.
FAQ
Qu'est-ce qu'un thread en Java?
Un thread en Java est une unité d'exécution qui permet de réaliser des tâches parallèles. Il peut être créé en héritant de la classe Thread ou en implémentant l'interface Runnable.
Pourquoi utiliser la synchronisation entre threads?
La synchronisation entre threads est nécessaire pour éviter les conflits d'accès aux ressources partagées, ce qui peut entraîner des comportements imprévisibles ou des erreurs.
Quelle est la différence entre une classe et une interface en Java?
Une classe en Java peut contenir des méthodes et des variables, tandis qu'une interface ne peut contenir que des méthodes abstraites et des constantes. Les classes peuvent hériter d'une seule classe, mais peuvent implémenter plusieurs interfaces.