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

86

J'ai ça dans mon code

Thread.currentThread().sleep(x);

Eclipse me dit d'utiliser la statique

Thread.sleep(x); 

au lieu de cela, pourquoi? Quelle est la différence, y a-t-il une différence de fonctionnalité entre ces 2 méthodes?

Omu
la source
1
il y a une `` action de sauvegarde '' dans Eclipse qui remplacera automatiquement l'accès aux membres statiques via des variables d'instance avec un accès statique via le nom de la classe - activez cette action de sauvegarde et autant d'autres actions de sauvegarde que vous acceptez (par exemple, supprimez les transtypages inutiles, inutile «ceci», etc.).
les2

Réponses:

135

Il n'y a qu'une seule méthode, pas deux, et c'est statique. Bien que vous puissiez appeler une méthode statique via une référence d'instance, ce n'est pas un bon style. Cela indique que le programmeur pense qu'il ou elle appelle une méthode d'instance. Un programmeur confus pourrait penser qu'il ou elle peut faire dormir un autre thread (pas le thread actuel) de cette façon, alors que ce n'est pas ce qu'il fait.

Vos deux lignes de code font la même chose mais la seconde est un meilleur style.

Sean Owen
la source
24
+1 pour mentionner que le programmeur peut vouloir faire dormir un thread particulier via someThread.sleep (), ce qu'il ne fait pas.
Chii
32

En Java, le sommeil est une méthode statique. Vos deux exemples font exactement la même chose, mais l'ancienne version est déroutante car il semble qu'elle appelle une méthode sur un objet spécifique, mais elle ne le fait pas du tout. Dans votre exemple, cela n'a pas beaucoup d'importance, mais c'est plus dangereux si vous avez les éléments suivants:

someOtherThread.sleep(x);

Cette fois, il semble que vous dites à un autre thread de dormir, mais en fait vous mettez le thread actuel en veille. Le moyen d'éviter de commettre ce type d'erreur est de toujours appeler des méthodes statiques en utilisant la classe plutôt qu'un objet spécifique.

Mark Byers
la source
Voulez-vous dire à la fois currentThread et someOtherThread passeront en veille pendant l'exécution de cette seule ligne "someOtherThread.sleep (x);" ??
Kanagavelu Sugumar
3
Non. Le thread actuel passera en veille, quel que soit l'objet Thread .sleep appelé. Vous ne pouvez pas endormir d'autres ThreadS (comme ça).
Couple
3

Les deux appels de méthode ont un comportement identique car ils invoquent la même méthode, mais l'utilisation du nom de classe ( Thread dans ce cas) plutôt que de l'instance pour accéder aux champs et méthodes statiques rend cette statique claire. C'est pourquoi cet avertissement est produit.

Mais étant donné que les champs et méthodes statiques sont affichés d'une manière particulière dans la plupart des IDE (par exemple en italique dans Eclipse et IntelliJ IDEA), cet avertissement est-il toujours nécessaire? Peut-être pas autant nécessaire qu'au début de Java que de simples éditeurs étaient utilisés.

Amir Moghimi
la source
0

Thread.currentThread().sleep(x);ou la façon dont Eclipse dit que si Thread.sleep(x);un contexte statique est requis s'il en a besoin, nous nous accrochons donc à un léger retard avec ce sommeil.

Le paradigme statique défini par un objet n'affecte que le cycle de vie d'impression du tas d'objet particulier, encore une fois compte tenu du cycle de vie global de l'objet statique n'est pas si gênant, si nécessaire, il peut être utilisé pour faciliter le codage, mais doit être fait avec précaution en tant que pied statique- print est référencé par Class(par exemple: - Class.forName(pkg.className)) comme similaire par son nom et non par une objectcopie d'impression unique à l'exécution de la classe en HEAPmémoire.

Encore une fois, l'utilisation de l'objet a également des avantages et des inconvénients par les références Weak, Phantom, Strong ....,

Le code est compliqué par la nature. C'est juste la façon dont nous faisons pour que cela fonctionne et fonctionne.

Dev Anand Sadasivam
la source
1
Pour parler de thread, - il apparaît de manière asynchrone, bien que nous puissions avoir des choses synchrones dans le threading. Par nature les choses, toutes les choses sont asynchrones, bien que nous trouvions des choses qui sont parfois synchrones. Aucune de ces choses n'est synchrone, même si nous nous mêlons du Quantum ou de l'Astronomie.
Dev Anand Sadasivam