« Programmation Java/Processus légers et synchronisation » : différence entre les versions

Contenu supprimé Contenu ajouté
Corrections
Ligne 35 :
Exemple :
<source lang="java">
public class MyThread extends Thread
{
public void run()
{
System.out.println("Un nouveau processus léger");
Thread.sleep(1000); // suspendu pendant 1 seconde
System.out.println("Fin du nouveau processus léger");
}
}
</source>
Il est alors créé et démarré de la manière suivante :
<source lang="java">
MyThread myth=new MyThread();
System.err.println("Démarrer le processus léger ...");
myth.start();
System.err.println("Le processus léger est démarré.");
</source>
Il n'est pas toujours possible d'étendre la classe <code>Thread</code> car Java n'autorise qu'une classe de base.
Ligne 60 :
Exemple :
<source lang="java">
public class MyClass extends AnotherClass
implements Runnable
{
public void run()
{
System.out.println("Un nouveau processus léger");
Thread.sleep(1000); // suspendu pendant 1 seconde
System.out.println("Fin du nouveau processus léger");
}
}
</source>
Le processus léger est alors créé et démarré de la manière suivante :
<source lang="java">
MyClass myclass=new MyClass ();
Thread th=new Thread(myclass); // <-- processus léger créé
System.err.println("Démarrer le processus léger ...");
th.start();
System.err.println("Le processus léger est démarré.");
</source>
== Actions sur un processus léger ==
Ligne 112 :
== Synchronisation ==
 
La synchronisation devient nécessaire quand plusieurs processus légerlégers accèdent aux mêmes objets.
 
=== mot-clé synchronized ===
Ligne 120 :
La syntaxe est la suivante :
<source lang="java">
... code non protégé ...
synchronized(objet) {
... code non protégé ...
}
... code non protégé ...
</source>
Le code protégé n'est exécuté que par un seul processus léger à la fois, tant qu'il n'a pas terminé le bloc d'instruction.
 
Durant l'exécution de ce code protégé par un processus léger, un autre processus léger ne peut exécuter celui-ci, mais peut exécuter un autre bloc <code>synchronized</code> si celui-ci n'utilise pas le même objet et qu'il n'est pas déjà en cours d'exécution.
 
Le mot-clé <code>synchronized</code> peut également être utilisé dans la déclaration des méthodes :
<source lang="java">
public synchronized void codeProtege() {
... code non protégé ...
}
</source>
est équivalent à :
<source lang="java">
public void codeProtege() {
synchronized(this)
{
... code non protégé ...
}
}
</source>
Pour une méthode statique (méthode de classe) :
<source lang="java">
public class MyClass {
public synchronized static void codeProtege() {
 
... code non protégé ...
public synchronized static void codeProtege() {
}
... code non protégé ...
}
}
}
</source>
est équivalent à :
<source lang="java">
public class MyClass {
public static void codeProtege() {
synchronized(MyClass.class) {
... code non protégé ...
}
}
}
</source>
 
=== Attente et signal ===
 
Quand le mot-clé <code>synchronized</code> ne suffit pas (par exemple, permettre l'accès à deux threadsprocessus légers simultanément au lieu d'un seul), il est possible de suspendre un processus léger et le réveiller.
 
La classe <code>Object</code> possède les méthodes suivantes :
Ligne 182 ⟶ 181 :
Exemple :
<source lang="java">
synchronized(myobj)
{
myobj.wait();
}
</source>
Comme ces méthodes sont définies dans la classe <code>Object</code>, il est possible de les utiliser avec n'importe quel type d'objet,et donc les chaînes de caractères et les tableaux.