• Aucun résultat trouvé

Exercices Java sur les threads autour de plusieurs balles

N/A
N/A
Protected

Academic year: 2022

Partager "Exercices Java sur les threads autour de plusieurs balles"

Copied!
2
0
0

Texte intégral

(1)

Exercices Java sur les threads autour de plusieurs balles

Université Paris Sud

Exercice 1 Remplissage avec 2 types de balles (synchronisation d’activités)

On veut ici remplir la fenêtre de l’application avec plusieurs types de balles, de même taille, différenciées par leur couleur. La fenêtre est ici vue comme une boîte dans laquelle on place les balles, comme on y déposerait des billes d’acier (les balles ne peuvent donc pas se chevaucher, mais sont les unes au-dessus des autres). Lorsque la fenêtre est remplie, l’application s’arrête.

1/ Prendre deux types de balles, des rouges et des vertes. Il y aura donc deux activités (threads) de remplissage : l’une d’entre elles remplit avec des balles rouges et l’autre remplit avec des boules vertes. les balles seront placées de gauche à droite et de bas en haut.

On crééra pour ces activités une classe StackBall qui sera une sous-classe de Thread(ou qui implantera Runnable).

Créer la classe StackableTwoBallsField (héritant de Applet dont la fenêtre sera remplie de balles.

Les deux activités précédentes (remplissage de balles rouges et remplissage de balles vertes) sont en compétition (“a racing condition” en anglais). On peut donc avoir un début de remplissage par l’une des activités et une fin de remplissage par une autre, ce qui n’est pas souhaitable. Si l’on veut un remplissage qui soit à peu près équilibré entre les différents types de balles, on ne peut mettre systématiquement des priorités échelonnées (sinon l’affichage se fera par types successifs de balles, selon l’ordre des priorités). Il faut donc prévoir un accès concurrent à la ressource partagée d’affichage.

Raffiner la structure en créant une classeSharedBoardpartagée entre les activités de remplissage et incluant deux méthodes (outre le constructeur) : la première, Point nextFreePlace()qui renvoie les coordonnées de la prochaine case libre à remplir, et la deuxième,draw(int x, int y, Color theColor) qui dessine effectivement la balle de couleur theColorà l’endroit spécifié (les coordonnées du coin en haut et à gauche du carré englobant la balle sont (x,y)). Se vervir du mot clé suynchronized pour réaliser un accès concurrent à l’unique objet de type SharedBoardqui aura été crée.

1

(2)

2 Exercices Java sur les threads autour de plusieurs balles

2/ Créer plusieurs types (couleurs) de balles, chaque activité de type StackBall ayant sa priorité. Demander à l’utilisateur d’entrer le nombre de balles ainsi que les priorités de chaque balle. Stocker les balles dans un objet de typeVector. Les cou- leurs des balles seront fixées au hasard (à l’aide d’unMath.random()sur les canaux RGB, se servant ensuite du constructeur suivant : Color(float redChannel, float greenChannel, float blueChannel)de la classeColor. Les valeurs des canaux sont alors comprises entre 0.0 et 1.0).

Exercice 2 Plusieurs balles rebondissantes (emploi de plusieurs activités)

Par opposition aux exercices précédents où il existe une classe séparée qui contient une Thread, ici la classeBallhérite elle-même deThread. Créer une application qui génère plusieurs balles rebondissantes, chacune étant une activité à part entière (une thread).

1/ Créer un nombre de balles fixe ou entré au clavier.

2/ Créer un Canvas (pour l’affichage des balles) et 2 Button, l’un qui génère une balle rebondissante supplémentaire et l’autre qui arrête l’application.

3/ Créer en plus :

– troisTextField pour entrer x,yetsize,

– troisScrollbar pour fixer la couleur (en RGB) de la prochaine balle.

Exercice 3 Plusieurs balles rebondissantes avec gestion des collisions

On cherche à affiner l’exercice précédent en gérant les collisions entre balles. La loi de choc sera ultra-simpliste : on agira comme si la balle que l’on heurte est une paroi plane (c.à.d. comme l’un des bords de la fenêtre). Afin de gérer les collisions, on crée un objet tableau partagé tableauPartage, synchronisé, qui connaît le nombre de balles présentes.

L’algorithme de fonctionnement est alors le suivant :

1. Chaque balle (chaque thread) va écrire sa nouvelle position dans le tableau partagé et incrémenter un compteur associé au tableau ; puis elle se met en sommeil par un wait(). Une tâche de gestion du tableau regarde périodiquement si toutes les balles ont écrit (par comparaison entre le compteur et le nombre de balles).

2. Lorsque toutes les balles ont écrit dans le tableau, la tâche de gestion remet le compteur à zéro et réveille toutes les balles par un notifyAll().

3. Une balle réveillée incrémente le compteur et regarde si une autre balle entre en conflit avec elle, auquel cas elle applique la loi de choc simpliste. Ceci fait, elle se remet en attente par wait(). La tâche de gestion du tableau attend que toutes les balles aient consulté le tableau.

4. Lorsque toutes les balles ont consulté le tableau, la tâche de gestion du tableau met à jour l’affichage (appel de repaint()) et réveille toutes les balles par unnotifyAll().

On revient alors en1.

Références

Documents relatifs

Grâce à leur pick-up de grande largeur, les presses QUADRANT 5300, 5200 et 4200 sont capables de traiter sans pertes même les andains les plus irréguliers.. − Ramassage propre

S'APPROPRIER : connaître le vocabulaire et savoir évaluer la probabilité d'un événement simple RÉALISER : construire un arbre de probabilité. ANALYSER : donner les issues

Classe en 4 équipes : 2 jouent et 2 regardent comment font les autres (mini-tournoi) Chaque équipe est dans un camp avec au départ un nombre équivalent de ballons de chaque

Se rappeler: Le quatrième lancer se fait avec la même balle que le premier mais avec l’autre main.. Exemple: Au départ: j’ai 2 balles (une rouge et une bleu) dans ma main droite et

Réaliser une horloge analogue à la précédente, mais avec un affichage graphique de secteurs circulaires bleu pour les secondes, rouge pour les minutes et jaune pour les heures.

Figure 5.2 Ajustement du bras de chargement selon la longueur des balles Le bras de chargement est équipé d’un dispositif de sécurité qui empêche l’utilisation du poussoir et

Le produit est comprimé dans le canal de pressage avec une pression réglable hydrauliquement depuis la cabine pour donner des balles dures et stables, d'une densité maximale

Un continuum qui le mène d’une violence conçue comme une violence de guerre, motivée par le maintien de l’ordre, à une violence presque exclusivement dirigée contre les femmes