Noções básicas de Java – a diferença entre dormir e esperar

Este artigo apresenta a diferença entre os métodos sleep e wait em Java

dormir()

Olhando para o método sleep, pode-se ver que é um método nativo estático

public static native void sleep(long millis) throws InterruptedException;

O método sleep() precisa ser especificado 等待的时间.

Ele permite que o thread em execução no momento suspenda a execução dentro de um tempo especificado e entre em um estado bloqueado. Este método pode não apenas permitir a execução de outros threads da mesma prioridade ou alta prioridade, mas também permitir a execução de threads de baixa prioridade. Chance .

Mas o método sleep() 不会释放“锁标志”, ou seja, se houver um bloco de sincronização sincronizado, outros threads ainda não poderão acessar os dados compartilhados.

espere()

public final native void wait(long timeout) throws InterruptedException;

O método wait() irá liberar o "sinalizador de bloqueio" do objeto.
Quando o método wait() de um objeto é chamado, a execução do thread atual será suspensa e o thread atual será colocado no pool de espera do objeto até que o método notify() seja chamado, ele será removido do objeto pool de espera e 任意一个线程colocado 锁标志等待池em , apenas os threads no pool de espera da marca de bloqueio podem adquirir a marca de bloqueio e estão prontos para competir pela propriedade do bloqueio a qualquer momento.

Quando o método notifyAll() de um objeto é chamado, todos os threads no pool de espera do objeto serão movidos para o pool de espera do sinalizador de bloqueio do objeto.
insira a descrição da imagem aqui
notify() só pode garantir que a condição seja satisfeita no momento da notificação. O tempo de execução do thread notificado e o tempo de notificação basicamente não coincidem, portanto, quando o thread for executado, é provável que a condição não tenha sido atendida (se não for garantida, outros threads entrarão na fila).
尽量使用 notifyAll()

notify() aguardará 随机地通知um thread na fila e notifyAll() notificará o thread na fila de espera 所有线程. Em termos de sentimento, notify() deveria ser melhor, porque mesmo que todos os threads sejam notificados, apenas um thread pode entrar na seção crítica.

Mas o chamado sentimento muitas vezes apresenta riscos. Na verdade, usar notify() também é muito arriscado. O risco é que alguns threads nunca sejam notificados.

Comparação Sleep() e wait()

a diferença

A diferença entre esperar e dormir é:

  1. wait会释放所有锁,而sleep不会释放锁资源.
  2. wait只能在同步方法和同步块中使用,而sleep任何地方都可以.
  3. sleep é um método estático de Thread e wait é um método de Object, que pode ser chamado por qualquer instância de objeto.

Mesmo ponto

Ambos têm o mesmo ponto: ambos serão transferidos CPU执行时间, aguardando serem despachados novamente!

Acho que você gosta

Origin blog.csdn.net/baidu_33256174/article/details/130715574
Recomendado
Clasificación