Diferença entre espera e suspensão em Java
1. Visão geral
Neste breve artigo, daremos uma olhada nos métodossleep()ewait() padrão no núcleo do Java e entenderemos as diferenças e semelhanças entre eles.
2. Diferenças gerais entreWait eSleep
Simplificando,wait() is an instance method that’s used for thread synchronization.
Ele pode ser chamado em qualquer objeto, como está definido emjava.lang.Object,, mas podeonly be called from a synchronized block. Ele libera a trava no objeto para que outro thread possa pular e adquirir uma trava.
Por outro lado,Thread.sleep() é um método estático que pode ser chamado de qualquer contexto. Thread.sleep() pauses the current thread and does not release any locks.
Esta é uma visão inicial muito simplista dessas duas APIs principais em ação:
private static Object LOCK = new Object();
private static void sleepWaitExamples()
throws InterruptedException {
Thread.sleep(1000);
System.out.println(
"Thread '" + Thread.currentThread().getName() +
"' is woken after sleeping for 1 second");
synchronized (LOCK) {
LOCK.wait(1000);
System.out.println("Object '" + LOCK + "' is woken after" +
" waiting for 1 second");
}
}
A execução deste exemplo produzirá a seguinte saída:
O fio 'principal' é acordado depois de dormir por 1 segundo O objeto '[email protected]' é despertado após esperar 1 segundo
3. AcordandoWait eSleep
Quando usamos o métodosleep(), um thread é iniciado após um intervalo de tempo especificado, a menos que seja interrompido.
Parawait(), o processo de ativação é um pouco mais complicado. Podemos ativar o encadeamento chamando os métodosnotify() ounotifyAll() no monitor que está sendo aguardado.
UsenotifyAll() em vez denotify() quando quiser despertar todos os threads que estão no estado de espera. Da mesma forma que o próprio métodowait(),notify() enotifyAll() devem ser chamados a partir do contexto sincronizado.
Por exemplo, aqui está como você podewait:
synchronized (b) {
while (b.sum == 0) {
System.out.println("Waiting for ThreadB to complete...");
b.wait();
}
System.out.println("ThreadB has completed. " +
"Sum from that thread is: " + b.sum);
}
E então, aqui está como outro encadeamento pode entãowake up the waiting thread – by calling notify() on the monitor:
int sum;
@Override
public void run() {
synchronized (this) {
int i = 0;
while (i < 100000) {
sum += i;
i++;
}
notify();
}
}
A execução deste exemplo produzirá a seguinte saída:
Waiting for ThreadB to complete…ThreadB has completed. Somafrom that thread is: 704982704
4. Conclusão
Esta é uma introdução rápida para a semântica dewaitesleep em Java.
Em geral, devemos usarsleep() para controlar o tempo de execução de uma thread ewait() para sincronização multi-thread. Naturalmente, há muito mais para explorar - depois de compreender bem o básico.
Como sempre, você pode verificar os exemplos fornecidos neste artigoover on GitHub.