wait
est défini dans Object
et non pas elle Thread
. Le moniteur sur Thread
est un peu imprévisible.
Bien que tous les objets Java disposent de moniteurs, il est généralement préférable de disposer d'un verrou dédié :
private final Object lock = new Object();
Vous pouvez obtenir des diagnostics légèrement plus faciles à lire, avec un faible coût en mémoire (environ 2K par processus) en utilisant une classe nommée :
private static final class Lock { }
private final Object lock = new Lock();
Afin de wait
ou notify
/ notifyAll
un objet, vous devez détenir le verrou avec l'objet synchronized
déclaration. Vous aurez également besoin d'un while
pour vérifier la condition de réveil (trouvez un bon texte sur le threading pour expliquer pourquoi).
synchronized (lock) {
while (!isWakeupNeeded()) {
lock.wait();
}
}
A notifier :
synchronized (lock) {
makeWakeupNeeded();
lock.notifyAll();
}
Il vaut la peine d'apprendre à comprendre à la fois le langage Java et le système de gestion de l'information. java.util.concurrent.locks
serrures (et java.util.concurrent.atomic
) lorsqu'on aborde le multithreading. Mais utilisez java.util.concurrent
structures de données chaque fois que vous le pouvez.
3 votes
Thread.wait() n'existe pas, il pourrait s'agir de this.wait()