0% ont trouvé ce document utile (0 vote)
7 vues49 pages

Gestion des Exceptions en Java

Le document traite des exceptions en Java, expliquant leur définition, les différentes catégories (Error, Exception, RuntimeException) et comment les gérer à l'aide des blocs try, catch et finally. Il aborde également la création d'exceptions personnalisées et la gestion des fichiers via la classe java.io.File, ainsi que les flux d'entrée et de sortie pour lire et écrire des données. Enfin, il présente la sérialisation, qui permet de convertir des objets en une représentation binaire pour le stockage ou l'échange.

Transféré par

mimisaleh08
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)
7 vues49 pages

Gestion des Exceptions en Java

Le document traite des exceptions en Java, expliquant leur définition, les différentes catégories (Error, Exception, RuntimeException) et comment les gérer à l'aide des blocs try, catch et finally. Il aborde également la création d'exceptions personnalisées et la gestion des fichiers via la classe java.io.File, ainsi que les flux d'entrée et de sortie pour lire et écrire des données. Enfin, il présente la sérialisation, qui permet de convertir des objets en une représentation binaire pour le stockage ou l'échange.

Transféré par

mimisaleh08
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

JAVA et Programmation orienté

objet
RAPPELS

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 1


Les Exceptions

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 2


Introduction
• Un programme peut échouer pour presque n'importe quelle raison.
• Voici quelques possibilités :
• Le code essaie de se connecter à un site web, mais la connexion Internet est
interrompue.
• Vous avez commis une erreur de codage et essayé d'accéder à un indice
invalide dans un tableau.
• Une méthode appelle une autre avec une valeur que la méthode ne prend
pas en charge.

• Certaines de ces raisons sont des erreurs de codage. D'autres


échappent complètement à votre contrôle.
• Votre programme ne peut rien faire si la connexion Internet est
interrompue. Ce qu'il peut faire, c'est gérer la situation.
=> Les exceptions représentent le mécanisme de gestion des erreurs.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 3


Définition
• Une exception est une erreur se produisant dans un programme qui
conduit le plus souvent à l'arrêt de celui-ci.
• Le fait de gérer les exceptions s'appelle aussi « la capture d'exception ».
• Le principe consiste à repérer un morceau de code (par exemple, une
division par zéro) qui pourrait générer une exception, de capturer
l'exception correspondante et enfin de la traiter.
• Afficher un message personnalisé et de continuer l'exécution.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 4


Définition
Catégories des exceptions:
1- Celles définies en étendant la classe Error :
• représentent des erreurs critiques qui ne sont pas
censée être gérées en temps normal.
• Par exemple, une exception de type
OutOfMemoryError est lancée lorsqu’il n’y a plus
de mémoire disponible dans le système.

2- Celles définies en étendant la classe Exception :


• représentent les erreurs qui doivent normalement
être gérées par le programme.
• Par exemple, une exception de type IOException
est lancée en cas d’erreur lors de la lecture d’un
fichier.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 5


Définition
Catégories des exceptions:
3- Celles définies en étendant la classe
RuntimeException:
• représentent des erreurs pouvant éventuellement
être gérées par le programme.
• L’exemple typique de ce genre d’exception est
NullPointerException, qui est lancée si l’on tente
d’accéder au contenu d’un tableau ou d’un objet
qui vaut null.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 6


Traitement des exceptions
Rattraper une Exception:
◦ Pour capter et traiter des exceptions on utilise le bloc try{…}catch{…}finally{…}:
try {
// les instructions susceptibles de provoquer des exceptions
// incluant éventuellement des appels de fonction

} catch ( exception-1 id-1 ) {


//les instructions pour gérer l’exception exception-1

} catch ( exception-2 id-2 ) {


//les instructions pour gérer l’exception exception-2

} finally {
// instructions à exécuter à chaque fois que ce bloc try s'exécute (facultative).

}
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 7
Traitement des exceptions
Rattraper une Exception:

• S'il y a plusieurs types d'erreurs et d'exceptions à intercepter, il faut


définir autant de blocs catch que de types d'événements.
• Dans l'ordre séquentiel des clauses catch, un type d'exception ne doit
pas venir après un type d'une exception d'une super-classe.
• Il faut faire attention à l'ordre des clauses catch pour traiter en premier
les exceptions les plus précises (sous-classes) avant les exceptions plus
générales.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 8


Traitement des exceptions
◦ Exemple:

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 9


Traitement des exceptions
Lancer une Exception: throw et throws
• Lors de la détection d'une erreur, un objet qui hérite de la classe
Exception est créé (on dit qu'une exception est levée) et propagé à
travers la pile d'exécution jusqu'à ce qu'il soit traité.
• Lorsque l’on veut lancer une exception, on utilise le mot clé throw suivi
de l’exception à lancer.
• Cette exception doit être d’abord créée avec new NomException().
• Pour déclarer les exceptions qui peuvent être lancées dans une
méthode on utilise throws.
• Une méthode avec une propriété throws peut lancer des exceptions
avec throw.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 10


Traitement des exceptions
Lancer une Exception: throw et throws
• Exemple

• Dans cet exemple, la méthode setNumberEggs peut potentiellement


lancer une exception de type IllegalArgumentException.
• IllegalArgumentException lancée pour indiquer qu'une méthode a reçu
un argument illégal ou inapproprié.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 11


Exceptions personnalisées
• En Java, il est possible de créer des exceptions personnalisées pour
gérer des situations spécifiques à votre application.
• Pour créer une exception personnalisée, vous devez créer une classe
qui étend l'une des classes d'exception de base de Java, généralement
"Exception" ou "RuntimeException", en fonction de votre besoin.
Syntaxe
public class MonExceptionPerso extends Exception {
public MonExceptionPerso() {
super("Message d'erreur de mon exception personnalisée");
}

public MonExceptionPerso(String message) {


super(message);
}
}
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 12
Exceptions personnalisées
• Exemple:
public class TropChaudException extends Exception {
public TropChaudException(String message) {
super(message);
}
public static void main(String[] args) {
}
int temperature = 110;
try {
if (temperature > 100) {
throw new TropChaudException("La température est trop élevée !");
}
[Link]("La température est normale.");
} catch (TropChaudException e) {
[Link]("Exception : " + [Link]());
}
}
}
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 13
La gestion de fichiers, flux
d’entrée sortie

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 14


Gestion de fichiers
•La gestion de fichiers se fait par l’intermédiaire de la classe [Link].

•Cette classe possède des méthodes qui permettent d’interroger ou d’agir sur le
système de fichiers du système d’exploitation.

•Un objet de la classe [Link] peut représenter un fichier ou un répertoire.

•Déclaration :

File monFichier = new File( [Link]);


• Il s’agit de la création d’objet File et non du fichier physique

[Link]();
• Création du fichier portant le nom [Link]

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 15


Méthodes de la classe [Link]
• File (String pathName)

• File (String path, String name)

• File (File dir, String name)

• boolean isFile () : vérifie s’il s’agit d’un fichier

• boolean isDirectory () : vérifie s’il s’agit d’un répertoire

• boolean mkdir () : création d’un répertoire

• boolean exists () : vérifie s’il existe ou non

• boolean delete () : supprime le fichier ou le répertoire

• boolean canWrite () : vérifie si le fichier peut être modifié

• boolean canRead () : vérifie si le fichier peut être lu

• File getParentFile () : renvoie le répertoire parent

• String [] list () : renvoie la liste des fichiers et des répertoires connu dans le répertoire
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 16
Les flux
• Pour obtenir des données, un programme ouvre un flux de données sur
une source de données(fichier, clavier, mémoire, etc).

• De la même façon pour écrire des données dans un fichier, un


programme ouvre un flux de données.

• Java emploie un flux (stream en anglais) entre la source et la


destination des données.

• Le flux est un canal de communication dans lequel les données sont


écrites ou lues de manière séquentielle.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 17


Les flux
• Deux groupes de classes manipulent des flux :
◦ les classes (abstraites)qui manipulent des flux d’octets (ou bytes) :
◦ La classe InputStream et ses dérivées pour lire des octets (FileInputStream),

◦ La classe OutputStream et ses dérivées pour écrire des octets (FileOutputStream)

◦ Les classes (abstraites) qui manipulent des flux de caractères :


◦ La classe Reader et ces dérivées (BufferedReader, FileReader)

◦ La classe Writer et ces dérivées (BufferedWriter, FileWriter)

• Toutes les classes d'entrée/sortie sont dans le package [Link].

• Toutes les méthodes peuvent générer une [Link].

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 18


Classes de flux d’octets
• Les classes qui gèrent les flux d'octets héritent d'une des deux classes
abstraites InputStream ou OutputStream.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 19


InputStream
les flux de communication:

FileInputStream:
◦ Permet de créer un flux avec un fichier présent dans le système de fichiers.
◦ Possède un constructeur prenant en paramètre un objet de type File et un autre
prenant un String comme paramètre, qui représente le chemin vers le fichier.

ByteArrayInputStream:
◦ Permet de lire des données binaires à partir d'un tableau d'octets.
◦ La source de ce flux est le programme lui-même.

PipedInputStream:
◦ Permet de créer une sorte de tube d'entrée (pipe) dans lequel circuleront des
octets.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 20


InputStream
Les flux de traitement:

BufferedInputStream:
◦ Cette classe permet la lecture de données à l'aide d'un tampon.

◦ Lorsqu'elle est instanciée, un tableau d'octets est créé afin de servir de tampon. Ce tableau est redimensionné
automatiquement à chaque lecture pour contenir les données provenant du flux d'entrée.

DataInputStream:

◦ Sert à lire des données représentant des types primitifs de Java (int, boolean, double, byte, ...) qui ont été
préalablement écrits par un DataOutputStream.

◦ Possède des méthodes comme : readInt(), readBoolean(), ...

ObjectInputStream:

◦ Permet de «désérialiser» un objet, c'est-à-dire de restaurer un objet préalablement sauvegardé à l'aide


d'un ObjectOutputStream..

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 21


InputStream
String nomFichier = "C:\\[Link]";
• try
Exemple
{
// Crée un objet FileInputStream pour lire le fichier
FileInputStream input = new FileInputStream(nomFichier);
// Crée un tampon pour stocker les octets lus à partir du fichier
byte[] tampon = new byte[1024];
int octetsLus;
// Lit le contenu du fichier et l'affiche à la console
while ((octetsLus = [Link](tampon)) != -1) {
// Transforme les octets lus en une chaîne de caractères
String texte = new String(tampon, 0, octetsLus);
[Link](texte);
}
[Link](); // fermer le FileInputStream
[Link]("\nLecture du fichier terminée avec succès.");
} catch (IOException e) {
[Link]();
}
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 22
OutputStream
Pour chaque flux d'entrée qu'on a vu, correspond un flux de sortie

Les flux de communication:

FileOutputStream:
◦ permet l'écriture séquentielle de données dans un fichier

ByteArrayOutputStream:
◦ permet d'écrire les données dans un tampon dont la taille s'adapte en fonction du besoin.

◦ On peut récupérer les données écrites avec la méthode toByteArray() ou bien toString().

PipedOutputStream:
◦ Permet la création d'un tube (pipe)

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 23


OutputStream
Les flux de traitement:

BufferedOutputStream:
◦ Permet d'écrire dans un tampon puis d'écrire le tampon en entier sur le fichier au lieu
d'écrire octet par octet sur le fichier.

DataOutputStream:
◦ Permet l'écriture de données sous format Java et assure une portabilité inter-
applications et inter-systèmes.

ObjectOutputStream:
◦ Permet de sauvegarder l'état d'un objet dans un fichier ou autre. Pour cela, l'objet doit
implémenter l'interface serializable.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 24


OutputStream
String nomFichier = "C:\\[Link]";
try {
// Crée un objet FileOutputStream pour écrire dans le fichier
FileOutputStream output = new FileOutputStream(nomFichier);

// Convertit la chaîne de caractères en tableau d'octets


String texte = "test";
byte[] donnees = [Link]();
// Écrit les données dans le fichier
[Link](donnees);
[Link](); // fermer le FileOutputStream
[Link]("Écriture dans le fichier binaire terminée avec succès.");
} catch (IOException e) {
[Link]();
}

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 25


La sérialisation

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 26


Définitions
• Le but de la sérialisation en Java est de permettre de transférer un
objet vers un support binaire.
• Elle permet de rendre un objet persistant, au-delà de l'exécution du
programme, pour stockage ou échange et vice versa.
• La sérialisation fait référence à la capacité de convertir des objets en
une représentation binaire, généralement dans le but de les
sauvegarder dans des fichiers ou de les transmettre via un réseau, et de
les reconstituer ultérieurement.
• Sérialiser un objet consiste à le convertir en un tableau d'octets, que
l'on peut ensuite écrire dans un fichier, envoyer sur un réseau au travers
d'une socket etc...

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 27


Définitions
• Le processus inverse est la désérialisation.

• Un objet sérialisé est dit persistant.

• Si un objet contient d’autres objets sérialisables, ceux-ci seront


automatiquement sérialisés.

• Si la classe a été modifiée entre la sérialisation et la désérialisation,


l’exception [Link] est déclenchée.

• Une classe est sérialisable si elle implémente l’interface [Link].

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 28


Sérialisation d’un objet
• Afin de pouvoir sérialiser un objet, il suffit que celui-ci implémente
l'interface Serializable.
• Exemple: création de la classe Person

public class Person implements Serializable {


private String name;
private int age;

// Constructeur, getters, setters, etc.


}

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 29


Sérialisation d’un objet
• Exemple: écriture d’un objet dans un fichier

void ecrire (Person person){


try{
FileOutputStream fileOut = new FileOutputStream("[Link]");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
[Link](person);
[Link]("Objet sérialisé avec succès.");
[Link]();
[Link]();
} catch (IOException e) {
[Link] ("Erreur d'ecriture " + e) ;
}
}

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 30


Désérialisation d’un objet
• Exemple: lecture d’un objet

void lire (){


try{
FileInputStream fileIn = new FileInputStream("[Link]");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person person = (Person) [Link]();
[Link]("Objet désérialisé avec succès. Nom : " + [Link]() +
", Âge : " + [Link]());
} catch (IOException | ClassNotFoundException e) {
[Link] ("Erreur d'ecriture " + e) ;
}
}

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 31


Les threads

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 32


Définitions
• Un thread est une unité d'exécution légère qui peut être considérée
comme un sous-processus dans un programme Java.
• Les threads permettent d'exécuter des tâches en parallèle, ce qui
signifie que plusieurs threads peuvent fonctionner en même temps.
• Un thread est un fil d'activité qui possède un cycle de vie (démarrage,
attente, fin), et qui peut lui-même lancer des threads fils.
• Un programme Java comporte toujours au moins un thread principal.
• Les threads seront très utilisés dans les applications réparties qui
doivent servir plusieurs requêtes à la fois.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 33


Définitions
• Les deux propriétés fondamentales des threads sont :

• Ils s'exécutent dans le même espace d'adressage en mémoire. En Particulier


dans le cadre d'un programme java, un objet créé par un thread est utilisable
par les autres threads du programme.

• Ils s'exécutent de manière concurrente. En d'autres termes, ils sont en


concurrence entre eux pour l'accès au processeur.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 34


Création d’un thread
• Un thread est un objet de la classe Thread.
• Il existe deux méthodes pour créer un thread en Java:
• En étendant la classe Thread :

Syntaxe
class MonThread extends Thread {
public void run() {
// Code du thread
}
}
MonThread t1 = new MonThread();
[Link](); // Démarre le thread

=> La méthode run ( ) décrit le corps d'activité du thread. Elle est appelée
implicitement lors du start du thread.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 35


Création d’un thread
• Un thread est un objet de la classe Thread.
• Il existe deux méthodes pour créer un thread en Java:
• En étendant la classe Thread :
Exemple
public class ThreadTest extends Thread{
public void run() {
for(int i=0; i<5; i++) {
[Link](i);
}
}
public static void main(String[] args) {
Thread t1 = new ThreadTest();
[Link]();
}
}
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 36
Création d’un thread
• Un thread est un objet de la classe Thread.
• Il existe deux méthodes pour créer un thread en Java:
• En implémentant l'interface Runnable :
Syntaxe
class MonRunnable implements Runnable {
public void run() {
// Code du thread
}
}
Thread thread = new Thread(new MonRunnable());
[Link](); // Démarre le thread

• => L'interface Runnable peut être implémentée par toutes classes dont les
instances sont destinées à être exécutées par un thread.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 37


Création d’un thread
• Un thread est un objet de la classe Thread.
• Il existe deux méthodes pour créer un thread en Java:
• En implémentant l'interface Runnable :
Exemple
public class ThreadTest2 implements Runnable {
public void run() {
for(int i=0; i<5; i++) {
[Link](i);
}
}
public static void main(String[] args) {
ThreadTest2 threadR = new ThreadTest2();
Thread t2 = new Thread(threadR);
[Link]();
}}
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 38
Création d’un thread
• Constructeurs de la classe Thread couramment utilisés :
• Thread()
• Thread(String name)
• Thread(Runnable r)
• Thread(Runnable r,String name)

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 39


États d'un Thread
1. Nouveau (new) : Lorsqu’un nouveau thread est créé, par exemple
avec Thread th = new Thread(a).
2. Prêt (runnable) : Le thread est prêt à être exécuté.
3. En cours d’exécution (running) : Le thread se voit allouer des cycles
CPU par l’ordonnanceur. Le thread est en cours d'exécution.
4. Suspendu (suspended): Un thread prêt ou en cours d’exécution
entre dans l’état suspendu lorsque sa méthode suspend() est
appelée.
5. En attente (Blocked/Waiting) : Le thread est en attente de
ressources ou d'une condition spécifique.
6. Terminé (Dead) : Le thread a terminé son exécution.

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 40


États d'un Thread

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 41


Gestion de Threads
• currentThread() : donne le thread actuellement en cours d'exécution.
• setName() : fixe le nom du thread.
• getName() : nom du thread.
• isAlive() : indique si le thread est actif (true) ou non (false).
• start(): démarre l'exécution d'un thread.
• run(): la méthode qui est exécutée lorsque le thread s'exécute.
Contenir les traitements à exécuter.
• sleep(long): fait passer le thread en état d'attente pendant une
certaine durée (comptée en millisecondes).

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 42


Gestion de Threads
• yield(): redonne explicitement le contrôle au planificateur. Demander
au scheduler de laisser la main aux autres threads.
• setPriority(int): changer la priorité du thread. Le thread avec la plus
grande valeur (le plus prioritaire) est activé préférentiellement.
• join(): jattendre la fin de l'exécution du thread.
• stop(): termine son exécution (il passe dans l'état "mort").
• suspend(): suspend l'exécution (doit être relancé par un "resume"
ensuite). Fait passer le thread dans un état d'attente.
• resume(): reprendre l'exécution du thread préalablement suspendue
par suspend( ).

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 43


Synchronisation
• Les threads partagent la même zone mémoire, il est nécessaire alors de
verrouiller l'accès simultané aux variables partagées.
• On utilise les primitives de synchronisation et le mot-clé synchronized.
• Ce mot-clé va définir des blocs de code ou des méthodes en tant que
sections critiques. Cela garantit qu'un seul thread à la fois peut exécuter
ce code.
• La synchronisation en Java se fait obligatoirement sur une portion de
code :
• une méthode statique
• une méthode non statique
• un bloc de code

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 44


Synchronisation
• Le mot clé synchronized permet de garantir un accès exclusif à une
portion de code pour un seul thread : le verrou est posé sur le moniteur
d'une instance d'un objet. L'instance utilisé dépend de la façon dont le
mot clé synchronized est utilisé dans le code.
• Le verrou sur le moniteur peut se faire de deux manières :
• une instance : cela permet de poser un verrou sur l'instance concernée.
• l'instance de type Class d'une classe : cela permet de poser un verrou quel
que soit le nombre d'instances créés de la classe. Cette solution est à utiliser
pour protéger des accès à des données static.

• Pour synchroniser toute une méthode, il suffit de définir la méthode


avec le modificateur synchronized. Dans ce cas, le moniteur utilisé est
l'instance courante (this).

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 45


Synchronisation
• Syntaxe:
public synchronized void maMethodeSynchronisee() {
// Code synchronisé
}

Public static synchronized void maMethodeSynchronisee() {


// Code synchronisé
}

public void maMethodeSynchronisee() {


N'importe quel objet peut
synchronized(this) {
être utilisé comme moniteur.
// Code synchronisé
Il est possible d'utiliser
}
l'instance courante.
}

KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 46


Synchronisation
Exemple

public class CompteBancaire {


private int solde = 1000;
// Méthode synchronisée pour effectuer un retrait
public synchronized void retirer(int montant) {
if (solde >= montant) {
solde -= montant;
[Link]("Retrait de " + montant
+ " effectué. Solde restant : " + solde);
} else {
[Link]("Fonds insuffisants pour
le retrait de " + montant);
}
}
}
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 47
Synchronisation
Exemple
class ClientBanque implements Runnable {
private CompteBancaire compte;
public ClientBanque(CompteBancaire compte) {
[Link] = compte;
}
public void run() {
for (int i = 0; i < 3; i++) {
[Link](300);
try {
[Link](100); // Pour simuler un
léger délai entre les retraits
} catch (InterruptedException e) {
[Link]();
}
}}}
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 48
Synchronisation
Exemple

public class ExempleSynchronized {


public static void main(String[] args) {
CompteBancaire compte = new CompteBancaire();
// Deux threads utilisent le même compte
Thread thread1 = new Thread(new
ClientBanque(compte));
Thread thread2 = new Thread(new
ClientBanque(compte));
[Link]();
[Link]();
}}

=> Les retraits sont effectués de manière séquentielle, car un thread attend que
l'autre ait terminé avant de continuer. Cela garantit que le solde du compte est mis à
jour de manière cohérente et qu'il n'y a pas de conflits de données.
KEBIRA AZBEG - SYSTÈMES RÉPARTIS - 2023/2024 49

Vous aimerez peut-être aussi