2010-08-09 9 views
7

Cuando coloco el código a continuación en NetBeans, NetBeans me da una advertencia al lado diciendo "Accediendo al modo estático de reposo".Java - Accediendo al Método Estático Dormir - ¿Qué ocurre?

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

¿Estoy haciendo algo mal? ¿Debo llamar esto de otra manera? No estoy haciendo nada multihilo. Solo tengo un método principal simple para el que quiero dormir por un tiempo.

+2

Como nota al margen: Desde Java 5, hay un TimeUnits y puede llamar a dormir en estos, lo que en mi opinión es mucho más legible. P.ej. 'TimeUnit.SECONDS.sleep (2); ' –

Respuesta

10

Thread.currentThread() devuelve una instancia de la clase Thread. Al invocar un método estático, solo desea trabajar en la clase en sí. Entonces, al invocar un método estático en el hilo actual, recibirá una advertencia de que está llamando al método en una instancia.

Usted acaba de llamar Thread.sleep(2000); Sería equivalente a Thread.currentThread.sleep(2000);

Esto es importante saber porque las personas han sido quemadas haciendo algo como:

Thread a = new Thread(someRunnable); 

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

Editar: Entonces, ¿cómo duerme un? A dormir un escribiendo la invocación del sueño dentro del ejecutable en el pasado al constructor, como:

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

Cuando 'a' se pone en marcha, Thread.currentThread en el método run someRunnable es la 'a' instancia hilo.

+0

Entonces, ¿cómo duermes? – Greg

+3

@Greg, no 'duerme', envía un mensaje a 'a' que necesita ir a dormir. Una forma de hacerlo es hacer que 'ejecutar' busque una variable que se está configurando, y si la variable está configurada, se pone a dormir, y un método en 'a' que un llamante externo puede usar para establecer esa variable. –

6

sleep es estático, por lo que puede acceder a él con Thread.sleep(2000);. Afecta el hilo actual.

Desde el javadoc:

Hace que el hilo se está ejecutando actualmente dormir (cesar temporalmente la ejecución) para el número especificado de milisegundos. El hilo no pierde propiedad de ningún monitor.

Lo que esto significa es que no se puede dormir otro hilo, sólo el que está en el código.

2

Eso es porque se declara el método sleep(), por lo tanto estática como

Thread.currentThread().sleep(2000); 

es la misma que

Thread.sleep(2000); 
1

netbeans que le advierten porque tiene acceso al método static desde la referencia del subproceso no desde la clase Thread. probar este método sueño

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

Hace que el hilo se está ejecutando actualmente a sleep.So hay necesidad de llamar Thread.currentThread().

1

cada vez que intente acceder método estático usando el objeto no es la mejor práctica, NB notifica, en ese momento, aquí es el mismo caso

Thread.currentThread() le devolverá un objeto de hilo

2

No hay ningún método en las instancias de Thread que corresponda a "sleep (long)".

Thread.currentThread(). Sleep (2000); compila, sin embargo, porque hay un método en la clase de subproceso que se llama sleep() con un argumento largo.

Java permite esto como un truco de tiempo del compilador para que los nuevos codificadores puedan ejecutar esto cuando se confunden con el acceso estático de los métodos.

Sin embargo, lo que en realidad esto se resolvió en el compilador es:

Thread.sleep (2000);

El siguiente código es también equivalente:

hilo t = new Thread (nueva Ejecutable() {public void run() {// hacer nada}}); t.sleep (2000);

Como ha señalado un afiche (John V), esto no hace que la instancia real del hilo (t) duerma: el hilo actual que creó el objeto del hilo se pone a dormir.

La advertencia existe de modo que recuerde que está accediendo a un método estático de una clase, no a un método de una variable de instancia.

El código apropiado para escribir siempre es Thread.sleep (2000); - Nunca acceda a métodos estáticos a través de una instancia para evitar confusiones y esta advertencia.

Cuestiones relacionadas