Enseignements

Programmation Concur TP 6

Prog. Concurrente et Répartie - TP6 : Executors et Futures

Calcul de PI par une approche multi-tache (avec Future) et utilisant un Pool de threads

  • recuperer ici les classes correspondant a cette application type
  • Vous convaincre de la justesse de cet algorithme pour calculer Pi. Utiliser par exemple cette explication
  • Le squelette de code fourni est organisé en vue d’une future “threadification”. En particulier, a quoi correspond la variable rank ? Remarquez aussi que nous avons nomme la methode de calcul call(). Ce n’est pas par hasard, mais que manque-t-il d’autre à la déclaration de la class LeibnizPi ?
  • Pour bien vous familiariser avec le programme fourni, faire une version mono-thread
  • Dans un deuxieme temps, completez le code Java fourni, en vous fiant aux commentaires dans le code source, afin qu’il soit multi-threadé, et ce, en utilisant un reservoir de threads
  • En supposant que vous faites ce TP sur une machine disposant de plus d’un core, il est pertinent de vérifier que vous utilisez plus qu’une thread pour effectuer le calcul dont nous venons de faire une version parallele. Pour cela, prenez des mesures de temps (se servir de java.util.Date et de la méthode getTime(), ou mieux de System.currentTimeMillis())), et affichez la durée de votre calcul selon que vous utilisez une ou plusieurs threads.

Programmation Sockets (en mode connecte/TCP) en Java

Le but est de developper une application simple, de type client-serveur, dans laquelle un client se connecte en mode TCP au serveur. Le serveur ayant accepte cette demande de connection ouvre un nouveau socket qui les relie, mais la gestion des données transmises sur ce socket doit etre réalisée par une nouvelle thread. Deux versions seront produites: une première dans laquelle, chaque traitement sera pris en charge par une nouvelle thread. Une seconde, dans laquelle, on se basera plutot sur un reservoir de threads, afin de limiter le nombre total de threads créées dans la JVM coté serveur.

  • Squelette du serveur (et autres squelettes utiles pour la suite) a récupérer ici. Ce serveur devra réaliser une opération très simple: il renvoie une chaîne de caractères au client, qui reflète la date du jour (obtenue coté serveur par un java.util.Date().toString()). Dans cette version, le client n’a pas besoin de passer de paramètres au serveur.

Completer le code fourni. Puis, tester à l’aide d’un simple terminal, dans lequel vous rentrerez la ligne de commande suivante: telnet adresseIP numPort dans laquelle adresseIP correspond à celle de la machine sur laquelle est supposé s’exécuter le serveur, ce dernier écoutant sur le numPort indiqué. Vous devriez obtenir la réponse souhaitée.

  • Développer à present le code Java correspondant au client
  • Partez de la version obtenue afin d’enrichir l’interaction entre le client et le serveur de sorte a ce qu’elle se realise dans les 2 sens: le client envoie d’abord un parametre au serveur, qui, une fois recupere permet a ce dernier de specialiser le traitement, et renvoyer ensuite au client la reponse desiree. Par exemple, le client pourrait demander d’obtenir non pas une fois la date du jour, mais un nombre de fois > 1.
  • Remplacer a present la creation systematique d’une nouvelle thread pour chaque requete faite par un client, par un reservoir de threads. Par exemple 2.

Une application Client-Serveur de type Commerage !

A partir de la derniere version obtenue a l’exercice precedent, developper une appli avec sockets en mode connecte dans laquelle le serveur auquel on se connecte fait office de commere ! En effet, chaque fois qu’un client de plus se connecte et envoie une information au serveur, alors, le serveur propage immediatement cette information a tous les clients actuellement connectes.

Par rapport a l’application precedente, il vous faudra gerer en plus la liste des clients actuellement connectes (utiliser un Vector < E> avec E de type PrintWriter afin de maintenir a jour la liste des clients actuellement connectes, cad. les canaux vers lesquels propager chaque message recu).

  • O`u allez vous gerer ce vecteur ? Faudra-t-il prendre ou non garde a ce que plusieurs threads de service accedent au vecteur en concurrence ?
  • Pour avoir le temps de lancer plusieurs clients afin de tester si le serveur fonctionne correctement, rajouter un sleep(…) a l’interieur du code de traitement d’une requete emise par un client.
  • Quel est l’effet d’avoir un reservoir de threads plutot que de creer une thread a chaque requete ?

Page d’Accueil

Enseignements 2017-18

Enseignements Antérieurs

Recherche…

edit SideBar

Blix theme adapted by David Gilbert, powered by PmWiki