0% ont trouvé ce document utile (0 vote)
36 vues3 pages

Synchronisation et Threads en Java

Java

Transféré par

Thioukry Boy
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
36 vues3 pages

Synchronisation et Threads en Java

Java

Transféré par

Thioukry Boy
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Université Eshahid Hamma Lakhdar El-Oued

Faculté des sciences exactes- Département d’informatique


ème
Module : SEII Niveau : 3 LMD

TP2 : Introduction à la synchronisation en Java


I. Objectifs du TP
Ce TP est une introduction à la notion de synchronisation des processus en Java. Nous commençons par
introduire quelques notions sur les threads en Java, puis nous étudions un exemple de condition de concurrence.

II. Les Threads en Java


On peut définir un thread de deux manières : avec la classe Thread ou bien avec l’interface Runnable de java. Dans
les deux cas, on doit avoir une méthode run()contenant le corps de l’exécution du thread. Le thread est lancé avec
l’appel de la méthode start()

 Avec la classe Thread :


// definition par extension de la classe
Thread class Process extends Thread {
public void run() {
...
}
}
// utilisation
Process p = new Process() ;
[Link]() ;

Cette première technique est adaptée si on veut qu’un objet de la classe Process utilise les méthodes de la classe
Thread.
Exemple :
class Multi extends Thread{
public void run(){
[Link]("thread is running...");
}
public static void main(String args[]){
Multi t1=new Multi();
[Link]();
}
}

Par contre, elle est inutilisable si la classe Process est par ailleurs une sous-classe d’une autre classe car il n’y a
pas d’héritage multiple en Java.

 Avec l’interface Runnable :


// definition par implementation de l’interface
Runnable class Proc implements Runnable {
public void run() {
...
}
}
// utilisation
Proc p = new Proc() ;
Thread t = new Thread(p);
[Link]() ;

1
Cette dernière technique est adaptée en Java si on veut que Proc soit par ailleurs une sous-classe d’une autre.
L’inconvénient de cette technique est l’impossibilité d’appeler les méthodes de la classe Thread.
Exemple :
class Multi3 implements Runnable{
public void run(){
[Link]("thread is running...");
}

public static void main(String args[]){


Multi3 m1=new Multi3();
Thread t1 =new Thread(m1);
[Link]();
}
}

II. 1. Premier Programme : [Link]


Soit un premier programme [Link], dont le code est le suivant :

public class exempleThread1 extends Thread {


private String toSay;
private int toWait;
private int number;
public exempleThread1(String toSay) {
[Link]=toSay;
}
public void run() {
for (int i =1; i< 1000; i++) [Link](i
+ " " + toSay );
}
public static void main(String args[]){ exempleThread1
thread1, thread2, thread3;
thread1=new exempleThread1("Hello ");
thread2=new exempleThread1("World ");
thread3=new exempleThread1("and Everybody ");
[Link]("Je suis le main :)");
[Link]();
[Link]();
[Link]();
[Link](0);
}
}

Le programme crée trois threads qui affichent 1000 fois respectivement "Helloʺ, "Worldʺ et "and
Everybodyʺ.

TAF : Compiler et exécuter le programme. Que pouvez--‐‐vous dire à propos de l’ordre d’affichage ? Que
pouvez--‐‐vous dire par rapport au nombre d’affichage ? Expliquer.

2
II. 2. Jointure des Threads

Dans cette partie, nous allons résoudre le problème de terminaison des threads en ajoutant un appel à la fonction
join avant l’appel à [Link](0) ;

La fonction join force le programme principal d’attendre la terminaison des threads.

TAF : Modifier votre programme en ajoutant trois appels à join. Compiler et exécuter le programme. Que
constatez--‐‐vous ?

Remarque : La fonction join est une fonction qui peut lancer une exception en Java. Il faut donc toujours
l’appeler dans un bloc try/catch, comme dans l’exemple suivant :

Try
{ [Link]();
} catch (Exception e) {}

II. 3. Partage de Ressources en Conditions de Concurrence


On veut mettre en évidence les conditions de concurrence pour deux threads. Le but de l’exercice est de
créer deux threads partageant une donnée (valeur initiale : init). Chacun des threads incrémente la valeur de cette
donnée n fois, puis affiche la dernière valeur trouvée. Un programme correct devrait donc afficher, à la fin de
l’exécution des deux threads, init + 2n.
Exemple :

init = 0 ;
n = 100 ;
Affichage obtenu :
Thread 1 : 100
Thread 2 : 200
Remarque : Java étant un langage orienté objet, pour créer une variable partagée on doit créer un objet, donc une
classe.
TAF :
1. Discuter selon les besoins de votre application :
 Combien de classes (au minimum) doit--‐‐on utiliser dans le programme final ?
 Combien de classes parmi celles--‐‐ci vont étendre la classe Thread ?

2. Donner le code mettant en place le fonctionnement de l’application. Modifier la valeur de n
pour mettre en évidence les conditions de concurrence. Discuter les résultats.

III. HomeWork
Ecrivez en java un programme qui utilise deux threads en parallèle :
le premier affichera les 26 lettres de l'alphabet ;
le second affichera les nombres de 1 à 26

Vous aimerez peut-être aussi