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 :
Le résultat obtenu :
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(); } } }
Mon problème c'est quand je souhaite réinitialiser les variables fournis, transmis et nbre_echantillons, je fais :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 !
J'obtiens des erreurs :
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(); } }
Si besoin des autres classes dites le moi, mais ça n'a pas trop d'importance à mon avis.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)
Merci!
Partager