2012-05-31 18 views
8

Así que estoy tratando de trabajar con hilos para un juego que estoy haciendo. Soy muy nuevo para el tema, así que puede que no entienda correctamente. Mi pregunta es cómo funciona el método currentThread() en la clase Thread de la API de Java. La API dice "Devuelve una referencia al objeto de subproceso que se está ejecutando actualmente", pero por lo que yo entiendo, varios subprocesos se ejecutan al mismo tiempo. ¿Cómo es posible devolver solo un hilo de ejecución?Método del hilo actual java

+0

debe leer algunos tutoriales sobre el roscado. – Sajmon

+2

Creo que deberían haberlo llamado getSelfThread() o algo así, porque puede haber más de un hilo que se ejecuta actualmente con cpus multinúcleo. – goat

Respuesta

6

El código que llama a currentThread se ejecutará en uno de los hilos, no en todos ellos, por lo que puede obtener ese hilo específicamente.

+0

Gracias eso lo hace mucho más claro. – user1427380

4

Cuando se ejecuta una instrucción en su código, se ejecuta dentro de un hilo específico. Este es el hilo devuelto por ese método.

Obviamente, si un método específico es ejecutado por múltiples hilos, cada ejecución puede devolver un valor diferente para Thread.currentThread().

Puede probar este breve ejemplo para tener una mejor idea de lo que está sucediendo y, en particular, el hecho de que los 2 hilos se ejecutan en paralelo. Debería ver que t1 funcionará con algunas bucle entonces t2 hará lo mismo y volver a t1, etc (puede que tenga que aumentar el número de bucles de un 5 a un número más alto dependiendo de la máquina):

public class TestThread { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       for (int i = 0; i < 5; i++) { 
        System.out.println(Thread.currentThread()); 
       } 
      } 
     }; 

     Thread t1 = new Thread(r, "t1"); 
     Thread t2 = new Thread(r, "t2"); 
     t1.start(); 
     t2.start(); 
    } 
} 
+1

¿Por qué debería imprimir el hilo actual en un bucle? Una vez debería ser suficiente, yo pensaría. – Jeffrey

+0

Me gustan tus primeras 2 oraciones ... pero el resto de la publicación, especialmente el código, parece lo suficientemente vago como para ser engañoso. – goat

+0

@Jeffrey la idea era mostrar un intercalado donde un subproceso podría ejecutar el ciclo dos veces y luego el otro se activa, etc. – assylias

0

"El hilo que se está ejecutando actualmente" significa que el programador del sistema le dio tiempo a este hilo para ejecutar su código.

-1

Varios subprocesos no se están ejecutando al mismo tiempo y hay un cambio de subprocesos entre varios subprocesos. El procesador puede ejecutar una tarea a la vez, por lo que se ejecuta un hilo al mismo tiempo. Entonces obtenemos la referencia del hilo que se está ejecutando actualmente.

+0

Las máquinas multinúcleo realmente funcionan múltiples hilos a la vez. Obtuve un programa de multiproceso masivo (con subprocesos altamente interactivos) trabajando en una máquina de núcleo único, luego lo moví a una máquina con 4 núcleos. Esa fue una verdadera educación. – RalphChapin

+0

"Varios hilos no se ejecutan_necesariamente al mismo tiempo ..." – jdv

4

Supongamos que tiene una lista de instrucciones impresas en una hoja de papel. Una persona lee las instrucciones y las realiza. Las instrucciones son un programa. La persona es un hilo. Podría hacer muchas copias del papel y pasarlas a muchas personas. Si las instrucciones dicen algo así como, "bótete", tú mismo se refiere a quien lee las instrucciones de ese papel. Del mismo modo, Thread.currentThread() se refiere al hilo que está ejecutando esa llamada al currentThread().

0

Al escribir una sola aplicación con hilos, puede razonar en su programa como una serie de instrucciones, cada una ejecutada después de la anterior (esto es una aproximación aproximada, pero el compilador conceptual y el procesador intentan simular eso y funcionan como si esto era realmente lo que estaba sucediendo).

Cuando utiliza múltiples hilos, cada hilo tiene su propia serie de instrucciones. Un hilo nuevo cuando se crea pasa un punto de entrada (un método) y continuará ejecutándose desde ellos. Cada hilo es independiente del otro hilo en su ejecución (simplemente ejecutará una instrucción después de la otra), aunque comparten memoria y, por lo tanto, el efecto secundario de un hilo puede afectar a otro.

Para que se ejecute algún código, debe hacerse en el contexto de un hilo (hay uno creado por el sistema operativo cuando se inicia la aplicación, que comienza su ejecución en el método Main). Cuando se llama a la función currentThread, está en uno de esos contextos.

El tiempo de ejecución de java al crear un hilo almacenará una referencia a ese objeto Thread en el contexto del hilo, y el currentThread buscará allí y devolverá el hilo actual.

0

En cualquier momento dado, solo se ejecutará un subproceso (en vivo), por lo que Thread.currentThread() devuelve los detalles del subproceso que se está ejecutando actualmente. por ejemplo, Thread_name, priority, method_name.

Cuestiones relacionadas