Este artigo apresenta a diferença entre os métodos sleep e wait em Java
Diretório de artigos
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.
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 é:
wait会释放所有锁,而sleep不会释放锁资源.
wait只能在同步方法和同步块中使用,而sleep任何地方都可以.
- 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!