Thread & Lock - fil d'execution
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:
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:
1 2 3 4 5
|
public void run() {
// traitement code retour serveur
next.notify();
} |
Une erreur est levée
Code:
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