TD : Thread Rappel de cours 1 Question préliminaire 2

Transcription

TD : Thread Rappel de cours 1 Question préliminaire 2
JAVA avancé
Master 1
Année 2006-2007
TD : Thread
Rappel de cours
Un processus est perçu comme un programme en cours d'exécution, ce qui suppose qu'il
faut lui allouer des ressources (mémoire, . . . ). Chaque processus peut-être dans trois états :
prêt, en exécution ou bloqué. Comme écrit précédemment, un processus a besoin de ressources
pour s'exécuter. On répertorie deux types de ressources : les ressources locales à chaque processus et les ressources partagées. Il est évident qu'une ressource partagée entre plusieurs
processus entraîne des problèmes d'accès concurrents, appartenant au problème de synchronisation. La suite d'instructions pendant laquelle la ressource est utilisé, est appelée section
critique. Les threads sont appelés également des "processus légers". Un processus est un
ensemble de threads. Un processus possède au moins un thread qui exécute le programme
principal (équivalent à la méthode main() ).
Remarque : La classe Thread et l'interface Runnable font partie du package java.lang.
1 Question préliminaire
Faire un programme JAVA qui lancera trois threads dénis dans une classe commune Test.
Chaque instance de cette classe se diérenciera par un unique identiant de type String. Cette
classe implémentera la méthode run(), de telle sorte qu'elle entraîne un achage de l'identiant. Quel achera provoquera l'exécution des trois threads.
Ensuite modier le corps de la méthode run() an que le thread "dorme" pendant un temps
aléatoire. Qu'entraînera la modication de cette méthode au niveau de l'exécution du main().
2 Course de chevaux
L'objectif de cet exercice est de réaliser une course de chevaux. Pour se faire, il va falloir
implementer au moins deux classes qui sont :
une classe Cheval,
une classe Course.
2.1
La classe
Cheval
Chaque cheval doit avoir son propre cycle d'exécution, ce qui implique l'utilisation des
"threads". Cette classe prend quatre attributs qui sont :
le nom du cheval, de type String,
le numéro de cheval, de type int,
la distance parcourue, de type int.
1. Écrire le constructeur par défaut qui doit initialiser ces attributs.
1
2. La vitesse du cheval ne doit pas être constante tout au long de la course. Dénir le cycle
d'exécution de la classe Cheval. L'idée est d'incrémenter la distance parcourue d'une
unité et de mettre le cheval en sommeil (à l'aide de la méthode sleep() ). La phase de
sommeil dépend de la vitesse du cheval.
3. De quelle autre manière aurait-on pu programmer cette classe ?
2.2
La classe
Course
La classe Course va mettre d'initialiser chaque cheval. Cette classe est dénie par une
longueur correspondant à la distance à parcourir par gagner la course (de type int ).
1. Implementer la méthode, initTabHorses(), qui permet d'initialiser chaque cheval (prévoir
au moins cinq chevaux).
2. Dénir une méthode, runCourse(), qui lance la course.
3. Prévoir une méthode, detectFin(), qui permet de détecter la n de la course. On peut
imaginer que lorsque un cheval passe la ligne d'arrivée (ie la distance parcourue =
distance de la course), il "informe" la classe Course de son arrivée.
4. Écrire la méthode main() qui initialisera une course et achera, à la n de la course, le
podium.
3 Accès concurrent : Écriture & Lecture dans un chier texte
L'objectif de cet exercice est d'écrire dans un chier texte par l'intermédiaire d'un thread
et de lire ce chier par l'intermédiaire d'un autre thread. La saisie se fera par le clavier1 . On
ne peut pas lire et écrire dans le même chier en même temps. Donc il va falloi s'assurer que
lorsqu'on commence à lire, l'écriture soit nie - et réciproquement.
1. dénir une classe Fichier qui prend en attribut, le nom du chier, la taille max du
chier (ie le nombre de mots qu'on peut écrire au maximum), un index indiquant le
nombre de mots écrits. Il faut également prévoir un BuerReader (pour la lecture)
et un PrintWriter(pour l'écriture). Il faut également prévoir les méthodes permettant
d'ouvrir/fermer les ux d'entrée/sortie.
2. Une classe mère Common qui dénira une variable static Fichier, une variable waitTime
de type long réprésentant un temps d'attente, car on souhaite associé un temps d'attente
entre l'écriture de chaque nouvelle ligne dans le chier texte, et un autre entre chaque
lecture du chier.
3. Une sous-classe Ecriture et une autre Lecture, qui implémentent la méthode run(). Sachant qu'on veut écrire une ligne par une ligne, et lire le contenu du chier. Modier la
Classe Fichier pour intégrer les primitives de lecture et d'écriture d'un chier texte.
1
Les commandes de saisie clavier sont :
System.out.println("saisie de l'instruction : ") ;
BueredReader clavier = new BueredReader(new InputStreamReader(System.in)) ;
String line = clavier.readLine() ;
2