2010-08-21 25 views
7

sleep() es un método estático de clase Thread. ¿Cómo funciona cuando se llama desde múltiples hilos? y cómo se descifra el hilo de ejecución actual. ?Cómo funciona Thread.sleep() cuando se llama desde múltiples hilos

o puede ser una pregunta más genérica ¿Cómo se llaman los métodos estáticos desde diferentes subprocesos? ¿No habrá problemas de simultaneidad?

Respuesta

6

¿cómo se determina el actual hilo de ejecución?

No tiene que ser así. Simplemente llama al sistema operativo, que siempre duerme el hilo que lo llamó.

+1

+1: No pude encontrar las palabras correctas. –

5

El método sleep duerme el hilo actual, por lo que si lo está llamando desde varios hilos, dormirá cada uno de esos hilos. También está el método estático currentThread que le permite obtener el hilo de ejecución actual.

-1

Thread.sleep(long) se implementa de forma nativa en la clase java.lang.Thread. He aquí una parte de su documentación del API:

Causes the currently executing thread to sleep (temporarily cease 
execution) for the specified number of milliseconds, subject to 
the precision and accuracy of system timers and schedulers. The thread 
does not lose ownership of any monitors. 

El método sueño sueños el hilo que lo llamó (Basado en los comentarios de EJP) determina el hilo de ejecución actual (que lo llamó y hacer que se duerma).. Los métodos de Java pueden determinar qué subproceso se está ejecutando al llamar al Thread.currentThread()

Los métodos (estáticos o no) se pueden invocar desde cualquier cantidad de subprocesos simultáneamente. No habrá ningún problema de concurrencia mientras sus métodos sean thread safe. Tendrá problemas solo cuando varios hilos estén modificando el estado interno de la clase o instancia sin la sincronización adecuada.

+0

@naikus de clase Thread dice es el sueño método nativo. ¿Alguna idea de cómo el código nativo determina qué hilo dormir? – YoK

+0

@Naikus. Lo que quería saber es cómo se ejecutan los códigos en los métodos estáticos en el alcance del subproceso. ¿Habrá una copia de cada método cargado en la pila de hilos? – JWhiz

+0

@YoK, no estoy seguro, pero tal vez llama a otro método nativo Thread.currentThread();). Estoy seguro de que lo sabes. – naikus

0

a más genérico Pregunta sería ¿Cómo se llaman los métodos estáticos de diferentes hilos? ¿No habrá problemas de simultaneidad?

Existe solo un posible problema de concurrencia si uno o más hilos modifica el estado compartido mientras que otro hilo usa el mismo estado. No hay un estado compartido para el método sleep().

-1

Cuando la máquina virtual encuentra una declaración sleep(long), interrumpirá el hilo que se está ejecutando en ese momento. "The Thread actual" en ese momento es siempre el hilo que llamó al Thread.sleep(). Entonces dice:

¡Hey! Nada que hacer en este hilo (Porque tengo que esperar). Voy a continuar otro hilo.

Cambiar el hilo se denomina "ceder". (Nota: puede ceder usted mismo llamando al Thread.yield();)

Por lo tanto, no tiene que averiguar cuál es el hilo actual. Siempre es el subproceso que llamó a sueño(). Nota: Puede obtener el hilo actual llamando Thread.currentThread();

Un breve ejemplo:

// here it is 0 millis 
blahblah(); // do some stuff 
// here it is 2 millis 
new Thread(new MyRunnable()).start(); // We start an other thread 
// here it is 2 millis 
Thread.sleep(1000); 
// here it is 1002 millis 

MyRunnable su run() método: implementació

// here it is 2 millis; because we got started at 2 millis 
blahblah2(); // Do some other stuff 
// here it is 25 millis; 
Thread.sleep(300); // after calling this line the two threads are sleeping... 
// here it is 325 millis; 
... // some stuff 
// here it is 328 millis; 
return; // we are done; 
+0

No hay 'interrupción'. – EJP

Cuestiones relacionadas