Java: Thread.currentThread (). Sleep (x) vs. Thread.sleep (x)

86

Eu tenho isso no meu código

Thread.currentThread().sleep(x);

Eclipse me diz para usar o estático

Thread.sleep(x); 

em vez disso, por quê? Qual é a diferença, existe alguma diferença de funcionalidade entre esses 2 métodos?

Omu
fonte
1
há uma 'Ação Salvar' no Eclipse que substituirá automaticamente o acesso de membros estáticos por meio de variáveis ​​de instância com acesso estático por meio do nome da classe - habilite esta Ação Salvar e quantas outras Ações Salvar como você concordar (por exemplo, remover conversões desnecessárias, desnecessárias 'isto', etc.).
les2

Respostas:

135

Existe apenas um método, não dois, e é estático. Embora você possa chamar um método estático por meio de uma referência de instância, não é um bom estilo. Indica que o programador pensa que está chamando um método de instância. Um programador confuso pode estar pensando que pode fazer com que outro thread (não o atual) adormeça desta forma, quando não é o que acontece.

Ambas as suas linhas de código fazem a mesma coisa, mas a segunda é um estilo melhor.

Sean Owen
fonte
24
+1 para mencionar que o programador pode querer fazer um determinado thread dormir por meio de someThread.sleep (), o que ele não faz.
Chii de
32

Em Java, o sono é um método estático. Ambos os seus exemplos fazem exatamente a mesma coisa, mas a versão anterior é confusa porque parece que está chamando um método em um objeto específico, mas não está fazendo nada disso. No seu exemplo, não importa muito, mas é mais perigoso se você tiver o seguinte:

someOtherThread.sleep(x);

Desta vez, parece que você está dizendo a algum outro thread para suspender, mas na verdade você está colocando o thread atual no modo de espera. A maneira de evitar esse tipo de erro é sempre chamar métodos estáticos usando a classe em vez de um objeto específico.

Mark Byers
fonte
Você quer dizer que currentThread e someOtherThread irão dormir enquanto executam esta única linha "someOtherThread.sleep (x);" ??
Kanagavelu Sugumar
3
Não. O thread atual irá hibernar, não importa qual objeto Thread .sleep seja chamado. Você não pode colocar outros ThreadS para dormir (assim).
Torque de
3

As duas chamadas de método são idênticas em comportamento porque invocam o mesmo método, mas o uso do nome da classe ( Thread , neste caso) em vez de instância para acessar campos e métodos estáticos torna essa condição estática clara. É por isso que este aviso é produzido.

Mas, considerando que os campos e métodos estáticos são mostrados de uma maneira particular na maioria dos IDEs (por exemplo, em fonte itálica no Eclipse e no IntelliJ IDEA), este aviso ainda é necessário? Talvez não seja tão necessário quanto no início do Java que editores simples estavam em uso.

Amir Moghimi
fonte
0

Thread.currentThread().sleep(x);ou a maneira como o Eclipse diz que o Thread.sleep(x);contexto estático é necessário se for necessário, então esperamos por um pequeno atraso com esse sono.

O paradigma estático definido por um objeto afeta apenas o ciclo de vida de impressão do heap de objeto específico, novamente considerando que o ciclo de vida do objeto geral estático não é tão incômodo, se necessário, pode ser usado para facilitar a codificação, mas deve ser feito com cuidado como print é referido por Class(por exemplo: - Class.forName(pkg.className)) como por nome e não por qualquer um objectque seja uma cópia de impressão única em tempo de execução da Classe na HEAPmemória.

Novamente, o uso de objeto também tem prós e contras pelos tipos de referências Fraca, Fantasma e Forte ....,

O código é complicado por natureza. É apenas a maneira como fazemos para que funcione e funcione.

Dev Anand Sadasivam
fonte
1
Para falar sobre thread, - ele surge de forma assíncrona, embora possamos ter coisas síncronas em threading. Por natureza, as coisas, todas as coisas são assíncronas, embora encontremos coisas que às vezes são síncronas. Nenhuma das coisas é síncrona, mesmo quando invadimos a Quantum ou a Astronomia.
Dev Anand Sadasivam