:: Enseignements :: ESIPE :: E4INFO :: 2007-2008 :: Java Réseau I - Concurrence et E/S ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
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.
-
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.
-
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 ?
-
É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().
-
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.
-
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.
-
Créer un ExecutorService en utilisant la classe
Executors permettant de distribuer le calcul
sur 5 threads différents.
-
É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.
-
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.
© Université de Marne-la-Vallée