Bonjour, pourriez vous m'éclairer sur un point que j'ai du mal à comprendre et donc à résoudre :
J'ai une liste ( Arraylist d'objets ) que je dois traiter ( traitement de données sur un serveur distant ) au fur et à mesure.
J'ai un Thread qui va faire ce traitement ( tache asynchrone ) un objet à la fois et qui doit se bloquer une fois réalisé en attendant le retour du serveur.
J'ai un second Thread qui va recevoir les données du serveur, dès que celui ci à reçu le traitement de l'objet traité dans le thread 1, il doit lui dire de passer à l'objet suivant
Je pensais utiliser ReentrantLock avec une Condition mais je dois peut être mal m'y prendre
et le second thread qui lui doit débloquer le thread1
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 private Lock lock = new ReentrantLock(); private Condition next = lock.newCondition(); ... ... monThread = new Thread(new Runnable() { @Override public void run() { lock.lock(); try{ for(MonObjet o : maListe){ traitement(o); next.await(); } } finally { lock.unlock(); } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public void run() { // traitement code retour serveur next.notify(); }
Une erreur est levée
Merci pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 java.lang.IllegalMonitorStateException: object not locked by thread before notify() at java.lang.Object.notify(Native Method) at fr.test.Utils.updateStatus(Utils.java:300) // next.notify(); at fr.test.Utils.access$13(Utils.java:293) at frtest.Utils$7.run(Utils.java:287) at java.lang.Thread.run(Thread.java:841)
Partager