Threads java - Différence entre sleep, wait et notify

Les deux méthodes sleep() et wait() mettent le thread courant en mode pause et il reprenne son chemin d'exécution après une notification qui serait déclenchée après un certain temps ou par un autre processus.

wait peut se réveiller par un autre thread qui appelle la méthode notifyIl est important que wait et notify soient appelées dans un bloc synchronized qui est utilisé pour l'exclusion mutuelle. La méthode notify réveille le premier processus qui a déclenché le wait.

Exemple de wait() et notify()

Dans ce programme, le processus B s’exécute à l'intérieur de processus A et crée une zone d'exclusion mutuelle pour bloquer et interdire au processus A d’exécuter l'instruction après le bloc try/catch.

public class Thread_A {
public static void main(String[] args) {

Thread Thread_B = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
int i=0;
while(i<100)
i++;
//libérer le thread A
notify();
}
}
});
Thread_B.start();

synchronized (Thread_B) {
try {
System.out.println("Thread A est bloqué - En attente de thread B"+
"qu'il termine");
//mettre en attente le thread A
Thread_B.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("le thread B a terminé - Le thread A est relaché");
}
}
}
Sortie
Thread A est bloqué En attente de thread B qu'il termine
le thread B a terminé. Le thread A est relaché

Exemple de sleep()

La méthode sleep() verrouille un processus et son exécution pendant une durée déterminée. Cette méthode est utilisée pour la synchronisation avec le temps (ex. réveille toi après 4 secondes) ou pour dire dors toi et laisse les autres threads s’exécutent.

public class Sleep {

public static void main(String[] args) {
ThreadA a = new ThreadA();
a.start();
ThreadB b = new ThreadB();
b.start();
}

static class ThreadA extends Thread{
@Override
public void run() {
try {
System.out.println("Thread A");
sleep(4000);
System.out.println("Thread A: J'ai dormis pendant 4 secondes");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

static class ThreadB extends Thread{
@Override
public void run() {
System.out.println("Thread B");
int somme = 0;
for(int i = 0 ; i < 50; i++)
somme +=i;
System.out.println("Thread B: j'ai terminé");
}
}
}
Sortie
Thread A
Thread B
Thread B: j'ai terminé
Thread A: J'ai dormis pendant 4 secondes
Le processus A a commencé avant le processus B mais le B a fait le traitement pendant que le A était endormi et a terminé le premier.