:: Enseignements :: ESIPE :: E4INFO :: 2007-2008 :: Java Réseau I - Concurrence et E/S ::
[LOGO]

Executor


Exercice 1 - Producteur et consommateur

On souhaite écrire un programme permettant de simuler un comportement de producteurs/consommateurs.
Un producteur est un thread qui à intervalle régulier va aller stocker un message dans une file bloquante.
Un consommateur est un thread qui à intervalle régulier va aller chercher un message dans la file bloquante, puis afficher ce message.
On entend par liste bloquante une liste qui, si il n'y a plus de message, met les consommateur en attente si ceux-ci demandent un message et les réveille lorsqu'un message arrive. De même, elle met les producteurs en attente si la liste est pleine et les réveille lorsqu'une place est libérée, c'est-à-dire, quand un message a été lu.

  1. Nous allons utiliser un java.util.concurrent.ScheduledExecutorService pour ordonnancer dans le temps les producteurs et les consommateurs.
    Rappeler la différence entre les méthodes schedule, scheduleAtFixedDelay et scheduleAtFixedRate de la classe ScheduledExecutorService.
    Puis, créer un ScheduledExecutorService à partir de la classe Executors et créer une tâche qui affiche bonjour toutes les 300 millisecondes.
  2. Puisque les producteurs et les consommateurs peuvent être bloqués par la file contenant les messages, doit-on les schéduler avec scheduleAtFixedDelay ou scheduleAtFixedRate ?
  3. Écrire une méthode créant le Runnable d'un producteur avec en paramètre la chaîne de caractères qui sera insérée par le producteur dans la file bloquante.
    Pour implanter la file bloquante, utiliser la classe java.util.concurrent.LinkedBlockingQueue ainsi que ses méthodes put() et take().
  4. Faire la même chose avec un consommateur en prenant en paramètre un entier unique id. Le consommateur, après avoir retiré un message de la file bloquante, affichera celui-ci avec son numéro uniqueid.
  5. Que pourrait-il arriver dans le cas où la file bloquante est pleine/vide ? Que faire pour éviter le problème ?

Exercice 2 - Travail en parallèle

On souhaite écrire un programme affichant les valeurs des racines carrées de 0 à 10 000. On souhaite paralléliser le programme et permettre d'exécuter en même temps plusieurs calculs.

  1. Créer un ExecutorService en utilisant la classe Executors permettant de distribuer le calcul sur 5 threads différents.
  2. Écrire le programme qui effectue le calcul en parallèle en utilisant des Runnable qui effectuent l'affichage.
    On permet ici que l'affichage ne s'effectue pas dans l'ordre des racines carrés croissantes.
    Penser à utiliser la méthode shutdown pour indiquer qu'il n'y a plus de calculs à effectuer.
  3. Modifier votre programme en utilisant l'interface Callable à la place de Runnable et le mécanisme de Future pour effectuer l'affichage dans l'ordre.