Royaume du Maroc
Université Ibn Tofail
Faculté des Sciences de Kenitra
TP 03: Programmation JAVA Avancée
Année Universitaire : 2024– 2025
Master Informatique et Intelligence Artificielle (M2IA)
Collections+Threads
Livrable :
Ce TP devra être réalisé en monôme. Le livrable est à rendre avant le 30/12/2024 à 23h59 par
email ([Link]@[Link]). Le titre de votre email doit contenir le titre « Livrable TP02
Java (nom et prénom) ». Votre livrable doit être au format zip ou rar et doit comprendre les codes
sources commentés sous forme d’un projet
Exercice 1
On souhaite à travers cet exercice de simuler la gestion des commandes des clients dans un supermarché.
Chaque commande peut contenir plusieurs produits, et un produit peut être commandé par plusieurs
clients.
Un produit est caractérisé par : un identifiant unique, un nom, et un prix.
Une commande est associée à un client (nom et ID unique) et contient une liste de produits avec
leurs quantités.
Le programme doit permettre :
o Ajouter un produit.
o Créer une commande pour un client en ajoutant plusieurs produits.
o Calculer le total de la commande.
o Afficher pour un produit donné :
Le nombre total d'unités vendues.
Les clients ayant acheté ce produit.
Collections suggérées :
HashMap pour stocker les produits (ID → Produit).
ArrayList pour gérer la liste des produits dans chaque commande.
TreeMap pour organiser les commandes des clients par ID.
Exercice 2
Cet exercice vise à simuler un système de vote électronique permettant de recueillir et d'analyser les votes
des électeurs.
1. Chaque vote est associé à un électeur (ID unique) et un candidat (nom).
2. Le programme doit permettre :
o Enregistrer les votes (1 vote par électeur).
o Calculer et afficher le nombre de votes par candidat.
o Identifier le gagnant de l’élection.
o Gérer les tentatives de votes multiples (empêcher un électeur de voter deux fois).
3. Choisir les collections adéquates pour résoudre cette exercice.
1
[Link]
Exercice 3
Le but de l’exercice est de simuler un ascenseur qui se déplace entre plusieurs étages dans un
immeuble. Plusieurs utilisateurs peuvent demander l'ascenseur à des étages différents, et
l'ascenseur doit répondre à ces requêtes.
L'ascenseur se déplace entre plusieurs étages.
Les utilisateurs peuvent appeler l'ascenseur à un étage donné.
L'ascenseur traite les requêtes une par une dans l'ordre d'arrivée.
L'ascenseur affiche son état actuel :
o Position actuelle (étage)
o Requêtes en cours
1. Ecrire la classe Ascenseur qui permet :
o Représente l'ascenseur.
o Gère les requêtes des utilisateurs via une file d'attente synchronisée.
o Utilise un thread pour simuler le déplacement entre les étages.
2. Ecrire la classe Utilisateur :
o Représente un utilisateur demandant l'ascenseur.
o Chaque utilisateur exécute un thread qui ajoute une requête dans la file de
l'ascenseur.
3. Ecrire une classe TestAscenceur
Exemple d’exécution
NB : utiliser « BlockingQueue 1»
Une BlockingQueue est une interface de la bibliothèque [Link]. Elle représente une file
d'attente thread-safe qui prend en charge des opérations de blocage pour l'insertion et la récupération des
éléments. Elle est spécialement conçue pour la programmation concurrente
1
[Link]
2
[Link]
Exercice 4( facultatif)
L’objectif de cet exercice est l’écriture d’un système de chat multi-utilisateurs qui se présente sous
forme d’un salon de discussion chat room et qui fonctionne sur un réseau local. Ce système de chat
est composé de deux programmes :
Programme Client et Programme Serveur.
Le programme client permet d’envoyer les messages au serveur qui s’occupe des dispatchers sur
tous les utilisateurs connectés au serveur. Les opérations d’envoi et de réception des messages au
niveau du client ne doivent pas bloquer l’exécution de ses autres fonctionnalités, ainsi, il faut
confier ces tâches à deux threads séparés (thread pour l’envoi et un autre pour la réception des
messages). Le client permet également d’envoyer des fichiers sans bloquer les autres tâches en
cours d’exécution. Le serveur permet de centraliser la communication entre les nœuds qui utilisent
le programme Client. Il s’occupe de gérer les connexions des clients et leurs messages, à chaque
fois que le serveur reçoit un message d’un client il l’ajoute à une file d’attente des messages reçus,
un autre thread s’occupe de dispatcher les messages de cette file sur tous les utilisateurs
connectés sur le serveur. La figure ci-dessus donne une vue générale sur la conception de cette
application, vous êtes donc invité à analyser et compléter cette conception puis l’implémenter en
Java.
3
[Link]