Le Coin Wiki
d'Olivier Dalle
$WikiTagline
 

Prog. Concurrente et Rpartie - 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 dclaration 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 vrifier 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 mthode getTime(), ou mieux de System.currentTimeMillis())), et affichez la dure 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 donnes transmises sur ce socket doit etre ralise par une nouvelle thread. Deux versions seront produites: une premire 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 cres dans la JVM cot serveur.

  • Squelette du serveur (et autres squelettes utiles pour la suite) a rcuprer ici. Ce serveur devra raliser une opration trs simple: il renvoie une chane de caractres au client, qui reflte 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 paramtres 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’excuter le serveur, ce dernier coutant sur le numPort indiqu. Vous devriez obtenir la rponse souhaite.

  • Dvelopper 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 ?