SERIE3
SERIE3
SERIE3
Department of
Computer Science
Network Programming -Master 1 2022-23-
Series n° 3
Exercice 1 : Concurrence
Soit la classe Resource ayant une chaine de caractères str comme propriété et les méthodes addChar
(int) qui ajoute une lettre de l’alphabet à str et addInt(int) qui ajoute un entier à str. Soit deux classes
threads Thd1 et Thd2 tel que Thd1 réalise l’ajout des caractères de l’alphabet et Thd2 ajoute des entiers
entre 1 et 26 (ie. Thd1 appelle addChar() et Thd2 addInt()) .
• Ecrire le code de la classe Resource
• Ecrire le code des deux threads
• Ecrire un programme principal tel que :
• Créer une seule ressource commune
• Créer deux threads T1 (de type Thd1) et T2 (de type Thd2) chacune de type différent
• Démarrer les threads et afficher la taille de la chaine produite par les deux
• Quelle est la remarque si on exécute le programme plusieurs fois.
• Ajouter le mot clé synchronized à l’entête des deux méthodes de la classe Resource.
• Quelle est votre remarque.
Exercice 2 programmation parallèle
Nous voulons effectuer la somme des entiers inférieures à un nombre n à l’aide de m threads. Le thread
reçoit la valeur du début de l’intervalle et celle de la fin, ensuite il sauvegarde le résultat dans une
variable d’objet. Le programme principal calcule le total par l’addition des sommes partielles trouvées
par les m threads.
Exemple :
Correction
Exercice 1
class Ressource {
private String str;
public Ressource() {
this.str = new String ("");
}
public synchronized void addChar(int c) {
this.str+=(char)c;
}
T1.join();
T2.join();
// 4 threads tel que: T1 [1, 250], T2 [251, 500], T3 [501, 750], T4 [751,
1000]
CalculThread[] threads = new CalculThread[nbThreads];
int pas = (fin - debut + 1) / nbThreads; // ici le pas est 250
long resultatTotal = 0;
for (int i = 0; i < nbThreads; i++)
try {
// attendre que le thread termine
threads[i].join();
resultatTotal += threads[i].getResultat(); // recuperer la somme
partielle
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Le résultat du calcul est : " + resultatTotal);
}
}
Exercice 3
import java.util.Random;
class Buffer {
synchronized public void put(char c) { // méthode pour déposer des éléments dans le buff[], synchronized pour
assurer l'accès d'un seul thread à cette méthode donc un élément est ajouter à la fois par un Producteur
while (compteur == taille) { // la condition de mise en veille de thread Producteur est : tant que le buff[] est
plein le producteur ne peut pas ajouter alors il attent q'un place soit libérée
try {
wait(); // mise en attente du thread Producteur
} catch (InterruptedException ex) {
System.out.println("Erreur " + ex);
}
} // cette condition est testée en permanence jusqu'à ce que le buff a de la place donc
synchronized public char get() { // méthode pour retirer des éléments du buff[], retourne un char
while (compteur == 0) { // la condiction ici c'est: tant que le buff[] est vide alors le consommateur n'a rien à
consommer donc il attent
try {
wait();
} catch (InterruptedException ex) {
System.out.println("Erreur " + ex);
}
}
char car = buff[index - 1]; // recuperer le caractère
buff[index - 1] = ' '; // effacer le caractère
index--; // recuperer la case correspondante
compteur--; // décrimenter le nombre d'éléments dans buff[]
notify(); // eveiller les threads en attente
return car; // retourner le caractère
}
}
private final Buffer buffer; // très important, c'est L'OBJET BUFFER commun entre le Producteur et le
Consommateur
}
}
@Override
public void run() {
while (true) {
Random rand = new Random(); // création d'un objet Random
buffer.put((char) (rand.nextInt(26) + 65)); // générer un caractère et l'insérer dans le buffer
}
}
}