wait
é definido em Object
, e não ele Thread
. O monitor ligado Thread
é um pouco imprevisível.
Embora todos os objetos Java tenham monitores, geralmente é melhor ter um bloqueio dedicado:
private final Object lock = new Object();
Você pode obter um pouco mais fácil de ler os diagnósticos, com um pequeno custo de memória (cerca de 2 K por processo) usando uma classe nomeada:
private static final class Lock { }
private final Object lock = new Lock();
Para / wait
ou um objeto, você precisa estar segurando a trava com a instrução Além disso, você precisará de um loop para verificar a condição de ativação (encontre um bom texto sobre o encadeamento para explicar o porquê).notify
notifyAll
synchronized
while
synchronized (lock) {
while (!isWakeupNeeded()) {
lock.wait();
}
}
Para notificar:
synchronized (lock) {
makeWakeupNeeded();
lock.notifyAll();
}
Vale a pena entender a linguagem Java e os java.util.concurrent.locks
bloqueios (e java.util.concurrent.atomic
) ao entrar no multithreading. Mas use java.util.concurrent
estruturas de dados sempre que puder.