Lorsque je mets le code ci-dessous dans Netbeans, Netbeans me donne un avertissement à côté de celui-ci disant "accéder à la méthode statique du sommeil". Est-ce que je fais quelque chose de mal? Devrais-je appeler cela différemment? Je ne fais rien de multi-fileté. J'ai juste une méthode principale simple que je veux dormir pendant un moment. P> p>
6 Réponses :
du Javadoc: P>
provoque le fil actuellement exécutant
dormir (temporairement cesser l'exécution)
Pour le nombre spécifié de
millisecondes. Le fil ne perd pas
propriété de tous les moniteurs. P>
blockQuote>
Qu'est-ce que cela signifie que vous ne pouvez pas dormir un autre fil, seul celui que le code est dans. P> SLEEP code> est statique, vous y accédez donc avec
thread.sleep (2000); code>. Il affecte le fil actuel. P>
c'est parce que la méthode Sleep () est déclarée comme statique, donc est identique à p>
thread.CurrentThread () renvoie une instance de la classe de thread. Lorsque vous invoquez une méthode statique, vous ne voulez que travailler sur la classe elle-même. Ainsi, appelez une méthode statique sur le thread de courant Vous obtiendrez un avertissement que vous appelez la méthode sur une instance.
Vous alliez simplement appeler Ceci est important à savoir parce que les personnes ont été brûlées comme: p> thread.sleep (2000); code> Ce serait équivalent à
Thread.CurrentThread.sleep (2000); Code> P>
Runnable someRunnable = new Runnable(){
public void run(){
Thread.sleep(2000);
}
};
@Greg, vous ne dormez pas 'dormir a', vous envoyez un message à «A» que cela doit aller dormir. Une façon de le faire est d'avoir exécuter code> Rechercher une variable étant définie et si la variable est définie, il se rend à votre disposition et une méthode dans 'A' pour qu'un appelant extérieur puisse utiliser pour définir cela variable.
NetBeans vous donnant un avertissement car vous accédez à la méthode statique de la référence de fil non de la classe de thread.
Essayez ceci la méthode de veille provoque le sommeil en cours d'exécution. N'ayez pas besoin d'appeler fil.currentThread (). p> p>
Chaque fois que vous essayez d'accéder à la méthode statique à l'aide de l'objet, ce n'est pas la meilleure pratique, NB donne un avertissement à ce moment-là, voici le même cas p>
thread.Currentthread () vous retournera un objet de fil p>
Il n'y a pas de méthode sur les instances de thread qui correspond à "Dormir (long)". P>
fil.currentThread (). Sommeil (2000); Compilez-vous cependant, car il existe une méthode sur la classe de thread appelée sommeil () avec un long argument. P>
Java permet de cela comme un truc de compilateur de sorte que de nouveaux codeurs puissent exécuter cela lorsqu'ils sont confondus sur l'accès statique des méthodes. P>
Cependant, ce que cela est réellement résolu à dans le compilateur est: p>
thread.sleep (2000); p>
Le code suivant est également équivalent: p>
thread t = nouveau thread (nouveau runnable () {Public Void Run () {// ne rien}}}); T.Sleep (2000); P>
comme une seule affiche (John V) a souligné, cela ne rend pas le dormeur de fil de thread (T) - le fil actuel qui a créé l'objet thread est mis en veille. P>
L'avertissement existe de telle sorte que vous vous souveniez que vous accédez à une méthode statique d'une classe, pas une méthode d'une variable d'instance. P>
Le code approprié pour écrire est toujours thread.sleep (2000); - Ne jamais accéder aux méthodes statiques à travers une instance pour éviter toute confusion et cet avertissement. P>
Notez la note: depuis Java 5, il y a un fuseau horaire et vous pouvez appeler votre sommeil sur ceux-ci, ce qui est à mon avis beaucoup plus lisible. Par exemple. 'TimeUnit.seconde.sleep (2); '