2010-08-09 12 views
7

Lorsque je mets le code ci-dessous dans NetBeans, NetBeans me donne un avertissement à côté de lui disant "Accès à la méthode statique sleep".Java - Accès à la méthode statique Sleep - Quel est le problème?

 try { 
      Thread.currentThread().sleep(2000); 
     } 
     catch(InterruptedException ie){ 
      //continue 
     } 

Est-ce que je fais quelque chose de mal? Dois-je appeler cela différemment? Je ne fais rien de multithread. J'ai juste une méthode principale simple que je veux dormir pendant un moment.

+2

En note: Depuis Java 5, il y a un TimeUnits et vous pouvez appeler sleep sur ceux-ci, ce qui est à mon avis beaucoup plus lisible. Par exemple. 'TimeUnit.SECONDS.sleep (2); ' –

Répondre

10

Thread.currentThread() retourne une instance de la classe Thread. Lorsque vous invoquez une méthode statique, vous ne voulez travailler que sur la classe elle-même. Si vous appelez une méthode statique sur le thread en cours, vous recevrez un avertissement que vous appelez la méthode sur une instance.

Vous appelez simplement Thread.sleep(2000); Il serait équivalent à Thread.currentThread.sleep(2000);

Il est important de savoir parce que les gens ont été brûlées faire quelque chose comme:

Thread a = new Thread(someRunnable); 

a.start(); 
a.sleep(2000); //this will sleep the current thread NOT a. 

Edit: Alors, comment pouvons-nous dormir un? Vous dormez un en écrivant l'invocation du sommeil dans le runnable passé au constructeur, comme:

Runnable someRunnable = new Runnable(){ 
    public void run(){ 
     Thread.sleep(2000); 
    } 
}; 

Lorsque « a » est lancé, Thread.currentThread dans la méthode d'exécution de someRunnable est le « a » instance de fil.

+0

Alors, comment dormez-vous? – Greg

+3

@Greg, vous ne «dormez pas», vous envoyez un message à «a» qu'il doit aller dormir. Une façon d'y parvenir est de faire en sorte que 'run' recherche une variable en cours de définition, et si la variable est définie, elle passe en mode veille et une méthode en 'a' qu'un appelant externe peut utiliser pour définir cette variable. –

6

sleep est statique, donc vous y accédez avec Thread.sleep(2000);. Cela affecte le thread actuel.

De la javadoc:

provoque le thread en cours d'exécution dormir (cesser temporairement l'exécution) pour le nombre spécifié de millisecondes. Le thread ne perd pas la propriété de tous les moniteurs.

Cela signifie que vous ne pouvez pas dormir un autre thread, seul celui que le code est.

2

C'est parce que la méthode sleep() est déclarée comme statique donc

Thread.currentThread().sleep(2000); 

est le même que

Thread.sleep(2000); 
1

netbeans vous donnant un avertissement parce que vous accédez à la méthode statique à partir de la référence Thread et non de la classe Thread. essayer cette

try { 
      Thread.sleep(2000); 
     } 
     catch(InterruptedException ie){ 
      //continue 
     } 

méthode de sommeil provoque le fil en cours d'exécution à sleep.So pas besoin d'appeler Thread.currentThread().

1

Chaque fois que vous essayez d'accéder à une méthode statique en utilisant l'objet, il n'est pas la meilleure pratique, NB Avertit à ce moment-là, voici le même cas

Thread.currentThread() vous renvoie un objet de discussion

2

Il n'y a pas de méthode sur les instances Thread qui corresponde à "sleep (long)".

Thread.currentThread(). Sleep (2000); compile cependant, car il existe une méthode sur la classe thread appelée sleep() avec un long argument.

Java permet cela comme une astuce temporelle du compilateur afin que les nouveaux codeurs puissent l'exécuter quand ils sont confus au sujet de l'accès statique des méthodes.

Cependant, ce que cela est en fait résolu dans le compilateur est:

Thread.sleep (2000);

Le code suivant est équivalent:

Discussion t = new Thread (new Runnable() {public void run() {// rien}}); t.sleep (2000); Comme l'a souligné une affiche (John V), cela ne fait pas dormir l'instance réelle du thread (t) - le thread actuel qui a créé l'objet thread est mis en veille.

L'avertissement existe de sorte que vous vous souvenez que vous accédez à une méthode statique d'une classe, pas une méthode d'une variable d'instance.

Le code approprié pour écrire est toujours Thread.sleep (2000); - N'accédez jamais à des méthodes statiques via une instance pour éviter toute confusion et cet avertissement.