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