Feuille de TP 1

publicité
Université de Provence
M ASTER I NFORMATIQUE
Programmation Parallèle
et Distribuée
2011-2012
PRAM et Thread Java
1
Exercice d’introduction
1. Écrire un programme qui va lancer 10 Threads, où chaque thread va afficher son numéro
deux fois (deux println distincts) sur la sortie standard. La première fois on affichera le
numéro du Thread puis ”Début” et la deuxième fois on affichera puis le numéro du Thread
puis ”Fin”. Qu’observez-vous ? Exécuter plusieurs fois votre programme ? Voyez-vous des
différences ?
2. Changer votre programme pour que chaque Thread attende un temps aléatoire entre les
deux affichages de ses numéros. Le temps d’attente (fonction sleep()) devra être compris
entre 0 et 1000 millisecondes. Voyez-vous des différences avec l’exécution sans l’attente ?
Aide
Pour créer un thread, il faut implémenter une classe ThreadPlus qui hérite de Thread avec le
mot clé extends. La nouvelle classe doit implémenter une méthode static void run() qui est le code
exécuté par le thread. Pour exécuter un thread, il suffit de créer un objet t de la classe ThreadPlus
et d’utiliser la méthode start() avec t.start().
Pour générer un nombre entre 0 et 1000, il suffit d’utiliser la méthode random() de la classe
Math qui renvoie un réel pseudo-aléatoire entre 0 et 1, et de multiplier le résultat par 1000. Ensuite, il suffit d’utiliser ce double n avec sleep((int)n). Il est à noter que puisque sleep peut lancer
une erreur de type InterruptedException, il faudra la placer à l’intérieur d’un bloc try catch.
2
Variable partagée
Dans cet exercice, on s’intéresse aux variables partagées et aux différentes façons de synchroniser les threads pour éviter les comportements anormaux.
1. Exécuter plusieurs fois le code de VariablePartagee.java (disponible à http:
//pageperso.lif.univ-mrs.fr/˜arnaud.labourel/PPD/codeTP1/
VariablePartagee.java). Qu’observez vous ? Expliquer le rôle du mot-clé volatile.
2. Exécuter plusieurs fois le code de VariablePartageeSynchronized.java (disponible à
http://pageperso.lif.univ-mrs.fr/˜arnaud.labourel/PPD/codeTP1/
VariablePartageeSynchronized.java) Qu’observez vous ? Expliquer le rôle du
mot-clé synchronized.
3. Exécuter
le
code
de
VariablePartageeBienSynchronized.java
(disponible
à
http://pageperso.lif.univ-mrs.fr/˜arnaud.labourel/PPD/codeTP1/
VariablePartageeBienSynchronized.java) Qu’observez vous ? Quelles sont les
différences ?
4. Proposer une solution complète de synchronisation.
1
3
Implémentation avec Runnable
On rappelle que, comme l’héritage multiple n’est pas possible en Java, il y a également une
autre méthode pour créer des threads, par l’implémentation de l’interface Runnable.
1. Exécuter le programme ExRunnable.java (disponible à http://pageperso.lif.
univ-mrs.fr/˜arnaud.labourel/PPD/codeTP1/ExRunnable.java).
2. Y-a-t’il des différences avec l’implémentation précédente ?
4
Calcul
Une approximation de e−1 nous est donné par la formule suivante :
e−1 =
n
X
(−1)i
i=0
i!
Ecrire un programme qui calcule un approximation de e−1 en additionnant n termes. Ce programme devra répartir la charge de calcul sur k threads.
5
Barrière simple
Une barrière est un objet synchronisant n threads. Elle dispose d’une fonction attendre qui va
être bloquante pour les n − 1 premiers appels et qui va débloquer tout le monde à n appels.
1. Écrire une classe Barrière qui peut être utilisée comme une barrière de synchronisation
réutilisable.
– Constructeur Barriere(int nb) : définit une barrière pour nb threads,
– Méthode attendre(void) : bloque les threads l’appelant jusqu’à ce que nb threads aient
appelé cette méthode.
Remarque : Il est préférable d’utiliser Wait et notifyAll s’utilisant dans une zone synchonized
2. Ecrire un programme réalisant une course équitable entre threads, ie bloquant les threads
jusqu’à ce qu’ils soient tous prêts à courir. Dans l’exercice précédent appeler la fonction
attendre() de la barrière entre les deux messages. Qu’observez vous ?
6
Gestion de compte en banque
1. Rappeler les deux méthodes de bases utilisées dans JAVA pour créer un thread. Quelle est
la différence entre les méthodes run et start ?
2. On considère maintenant le code de Compte.java et Banque.java (disponible à http://
pageperso.lif.univ-mrs.fr/˜arnaud.labourel/PPD/codeTP1/Compte.java
et
http://pageperso.lif.univ-mrs.fr/˜arnaud.labourel/PPD/codeTP1/
Banque.java) Ce code permet-il de simuler correctement le fonctionnement d’un compte
bancaire ? Si non, proposez une solution.
7
Tri et Réseaux de Tri
1. Implémenter une machine PRAM linéaire comme vu en TD.
2. Implémenter l’algorithme de tri avec une machine PRAM.
2
Téléchargement