Bonjour,

J'essaie de réaliser un petit système où des robots doivent déposer un contenu dans des paniers, informer le central qui attends que tous les robots aient déposés leur contenu, puis le central transmet les échantillons au laboratoire, et une fois transmis on transmet aux robots une nouvelle mission.

Pour les conditions de blocage des processus j'ai fais :
Un Robot se bloque si la transmission au labo n'a pas été envoyé.

Le Central se bloque si tous les robots n'ont pas déposés leurs échantillons.

Pour les réveils:
Un robot réveil le central s'il est le dernier à ajouter son échantillon.

Le central réveil les robots lorsque la transmission a été effectuée.

Voici la classe représentant le moniteur :

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package moniteur;
 
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
 
public class AccesPanier {
 
    ReentrantLock lock = new ReentrantLock();
 
    Condition robot = lock.newCondition();
    Condition central = lock.newCondition();
 
    int nbre; // Nombre d'échantillons avant de lancer la transmission
    int nbre_ech; // Sera décrémentée pour tester le nbre de paniers
    boolean fournis = false, transmis = false; 
    // fournis : true =>  tout a été déposé
    // transmis : true => les échantillons ont été transmis
 
    public AccesPanier(int nbre){
        this.nbre = nbre;  //initialisation
        this.nbre_ech = nbre;
    }
 
 
    public void deposerEchantillons(){
        lock.lock();
 
        nbre_ech --;
        if(nbre_ech == 0){ // Si tous les paniers sont remplis
            fournis = true;
            central.signal();
            System.out.println("tout a été déposé déposé");
        }
 
        lock.unlock();
    }
 
    public void repartirEnMission(int numero){
        lock.lock();
 
        while(!transmis){  //Test s'il y a eu transmission au labo
            try {
                robot.await();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
 
                System.out.println("Le robot numéro "+numero+" se voit attribuer une nouvelle mission !");
 
                lock.unlock();
            }
        }
 
    }
 
    public void transmission(){
        lock.lock();
 
        while(!fournis){
            System.out.println("Le central attends les echantillons");
            try {                
                central.await();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } 
 
        transmis = true;
        System.out.println("Echantillons envoyés !");
 
        lock.unlock();
    }
 
 
    public void reinitialiserMission(){
        lock.lock();
        try{
        if(transmis){
            robot.signalAll();            
        }
            System.out.println("Le central renvoit tous les robots en mission !");
        }
        finally {
            lock.unlock();
        }
    }
 
 
}
Le résultat obtenu :
Le robot numéro 0 va déposer ses échantillons
Le robot numéro 1 va déposer ses échantillons
Le robot numéro 2 va déposer ses échantillons
tout a été déposé déposé
Echantillons envoyés !
Le central renvoit tous les robots en mission !
Le robot numéro 0 se voit attribuer une nouvelle mission !
Le robot numéro 1 se voit attribuer une nouvelle mission !
Le robot numéro 2 se voit attribuer une nouvelle mission !
Mon problème c'est quand je souhaite réinitialiser les variables fournis, transmis et nbre_echantillons, je fais :

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
public void reinitialiserMission(){
        lock.lock();
        try{
        if(transmis){
            robot.signalAll();            
        }
            nbre_ech = nbre; // réinitialisation
            fournis = false;
            transmis = false;
            System.out.println("Le central renvoit tous les robots en mission !");
        }
        finally {
            lock.unlock();
        }
    }
J'obtiens des erreurs :
Le robot numéro 0 va déposer ses échantillons
Le robot numéro 1 va déposer ses échantillons
Le robot numéro 2 va déposer ses échantillons
tout a été déposé déposé
Echantillons envoyés !
Le central renvoit tous les robots en mission !
Le robot numéro 0 se voit attribuer une nouvelle mission !
Le robot numéro 0 se voit attribuer une nouvelle mission !
Le robot numéro 1 se voit attribuer une nouvelle mission !
Le robot numéro 2 se voit attribuer une nouvelle mission !
Le robot numéro 1 se voit attribuer une nouvelle mission !
Le robot numéro 2 se voit attribuer une nouvelle mission !
Exception in thread "Thread-3" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.unlock(Unknown Source)
at moniteur.AccesPanier.repartirEnMission(AccesPanier.java:51)
at core.Robot.run(Robot.java:22)
at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-4" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.unlock(Unknown Source)
at moniteur.AccesPanier.repartirEnMission(AccesPanier.java:51)
at core.Robot.run(Robot.java:22)
at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-5" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.unlock(Unknown Source)
at moniteur.AccesPanier.repartirEnMission(AccesPanier.java:51)
at core.Robot.run(Robot.java:22)
at java.lang.Thread.run(Unknown Source)
Si besoin des autres classes dites le moi, mais ça n'a pas trop d'importance à mon avis.

Merci!