Salut,
Lorsqu'on fait du multi thread, on a souvent un thread1 qui fait:
et le thread2 serait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while () { truc truc truc dire au thread2 qu'il peut travailler => lock.notify() }
Je ne comprends pas trop comment utiliser en toute sécurité ce système car le problème est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while () { attendre que lock soit libre pour travailler => lock.wait() travaille travaille travaille }
Si le travail du thread2 prend plus de temps que prévu, le thread1 va éventuellement faire 2 ou 3 notify pendant que le thread2 travaillera toujours.
Or dans certains cas il est important que tous les événements soient pris en compte, pas 1 de plus ni 1 de moins. On peut avoir aussi besoin de repérer le dernier événement (valeur ayant atteint une certaine valeur) donc si on a plusieurs notify, on le rate.
C'est un programme idiot mais par exemple avec ce code :
On a un thread qui compte de 1 à 500 et l'autre qui affiche la valeur dès qu'elle change. La sortie donne ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public class Semaphores { private static final Object lock = new Object(); private static int nombre; public static void main(String[] args) { (new Thread(){ public void run () { for (int i=0;i<500;i++) { synchronized(lock) { nombre=i+1; lock.notify(); } } } }).start(); for (;;) { synchronized (lock) { try { lock.wait(); } catch (InterruptedException e) {e.printStackTrace();} System.out.println("nombre a changé de valeur : nombre=" + nombre); } } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 nombre a changé de valeur : nombre=3 nombre a changé de valeur : nombre=237 nombre a changé de valeur : nombre=309 nombre a changé de valeur : nombre=311 nombre a changé de valeur : nombre=388 nombre a changé de valeur : nombre=453 nombre a changé de valeur : nombre=455
Pouvez-vous m'éclaircir sur le sujet ?
Merci
Partager