:: Enseignements :: IMAC :: IMAC2 :: IMAC2 2011-2012 :: Programmation Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Programmation concurrente multi-threads |
Ce TD introduit l'usage de threads pour la programmation concurrente.
Exercice 1 - Plusieurs tâches concurrentes
Les threads permettent de réaliser plusieurs tâches simultanément ; l'ordonnanceur du système se charge de répartir le temps et les ressources processeurs allouées au différentes threads. Nous allons créer k threads ; chacune va être chargée en boucle d'incrémenter un compteur et afficher son contenu.
Créer k threads ; chacune est chargée en boucle d'incrémenter un compteur et afficher son contenu. Comparer les compteurs des threads afin d'en déduire si les ressources de calcul sont bien réparties. On pourra tester la méthode setPriority(int priority) sur certaines threads. On peut arrêter toutes les threads au bout d'un temps défini.
Exercice 2 - Deception point
Voici l'implantation d'une classe Point représentant un point sur un plan 2D. La méthode
main créé deux threads fixant pour l'une les coordonnées des points à (0,0), pour l'autre à (1,1) et affichant le point modifié :
public class Point
{
private int x,y;
public void move(int x,int y) { this.x=x; this.y=y; }
@Override public String toString() { return "("+x+','+y+')'; }
public static void main(String[] args)
{
final Point p=new Point();
for(int i=0;i < 2;i++)
{
final int id=i;
new Thread(new Runnable() {
public void run()
{
while ( ! Thread.currentThread().isInterrupted() )
{
p.move(id,id);
System.out.println("Thread #" + id + ": " + p);
}
}
}).start();
}
}
}
Expliquer pourquoi on peut afficher des points de contenu hybride (0,1) ou (1,0). Rajouter un moniteur (bloc synchronized) pour éviter cette situation.
Exercice 3 - Swing Time
Nous souhaitons implanter une petite horloge analogique avec l'API graphique Swing.
- Créer un nouveau composant dérivant de JPanel affichant une horloge analogique (on trace un cercle et les aiguilles des heure, minute et seconde en redéfinissant paintComponent). Ce composant dispose d'une méthode setTime(java.util.Date date) afin de fixer l'heure courante à afficher.
- Afficher une instance de ce composant sur une fenêtre avec un bouton permettant d'afficher l'heure courante sur l'horloge.
- Créer une thread mettant rafraichissant automatiquement l'horloge. Il n'est pas possible pour des problèmes de concurrence d'appeler directement des méthodes créant des évènements graphiques Swing depuis une autre thread. Il faut soumettre le code à exécuter avec SwingUtilities.invokeLater(Runnable r). On pourra utiliser Thread.sleep(int) pour mettre la thread en sommeil entre deux demandes de rafraîchissement. On pourra aussi utiliser la classe Timer.
© Université de Marne-la-Vallée