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

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();
             }
 
        }
}
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
 
public void run() {
 // traitement code retour serveur 
 next.notify();
}

Une erreur est levée
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)
Merci pour votre aide