TP 7 de Programmation 2e Année Informatique 2003-2004 : Threads

Exercice 1

Récupérez et décompressez snails.tgz. Il s'agit d'un simulateur de courses d'escargots.

Question 1

Lire les différentes classes.

Question 2

Chaque escargot sera contrôlé par un thread qui augmentera son abscisse d'une valeur donnée (par exemple 10), fera une pose de 100ms, et ce jusqu'à ce que l'escargot aie passé la ligne d'arrivée. La classe utilisée sera EscargotControle. Complétez les classes CourseEscargotAppli et EscargotControle.

Question 3

On souhaite afficher en fin de course un message annonçant que la course est terminée. Pour ce faite, on veut utiliser la méthode join(). Supposons que l'on place les appels de join() dans la méthode commence(). Que se passe-t-il alors ?

Exercice 2

À faire sur papier. On considère la classe Pile implémentée ainsi :

public class Pile {
    private int vals[];

    private int nombreElts;

    public Pile(int taille) {
	vals= new int[taille];
	nombreElts= 0;
    }

    public void push(int v) {
	vals[nombreElts]= v;
	nombreElts++;
    }

    public int getTop() {
	return vals[nombreElts-1];
    }

    public boolean isFull() {
	return (nombreElts == vals.length)
    }

    public void pop() {
	nombreElts--;
    }
}
    

Question 1

Supposons que cette classe soit employée par plusieurs Threads. Donner un exemple de comportement incorrect possible, en cas d'appel simultané de la méthode push par deux threads.

Question 2

En supposant que toutes les méthodes de Pile sont synchronized, Le code :
      if (! p.isFull()) {
        p.push(v);
      }
    
est-t-il sûr ?

Question 3

Écrire une méthode push() sûre, qui bloque tant que l'ajout n'est pas possible.

Exercice 3

Soit la classe Pile et la classe TestPile.

Question 0

Essayez le programme tel quel. Il y a toutes les chances qu'il buggue parfois.

Question 1

Programmez la solution de l'exercice 3, et regardez à l'aide de gtop combien de CPU votre programme utilise. Vous supprimerez le sleep() dans le thread client, pour mieux voir la charge du CPU.

Question 2

Modifiez le programme pour qu'il ne fasse pas d'attente active. On modifiera a priori la classe Pile.


Serge ROSMORDUC