¿Cuál es la diferencia entre Thread start() y Runnable run()?

4 minutos de lectura

¿Cual es la diferencia entre Thread start y Runnable run
Ori Popowski

Digamos que tenemos estos dos Runnables:

class R1 implements Runnable {
    public void run() { … }
    …
}

class R2 implements Runnable {
    public void run() { … }
    …
}

Entonces cual es la diferencia entre esto:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();

    r1.run();
    r2.run();
}

Y esto:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);

    t1.start();
    t2.start();
}

¿Cual es la diferencia entre Thread start y Runnable run
Bhesh Gurung

Primer ejemplo: No hay múltiples hilos. Ambos se ejecutan en un único subproceso (existente). Sin creación de hilos.

R1 r1 = new R1();
R2 r2 = new R2();

r1 y r2 son solo dos objetos diferentes de clases que implementan el Runnable interfaz y así implementar la run() método. Cuando usted llama r1.run() lo está ejecutando en el hilo actual.

Segundo ejemplo: Dos hilos separados.

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1 y t2 son objetos de la clase Thread. Cuando usted llama t1.start()comienza un nuevo hilo y llama al run() método de r1 internamente para ejecutarlo dentro de ese nuevo hilo.

  • ¿Podría considerar que antes de llamar a Thread#start(), no sucede nada realmente relacionado con el hilo del sistema operativo? Es solo un objeto java.

    – JaskeyLam

    6 de diciembre de 2014 a las 9:38

  • Eso es correcto según la documentación. Verifique el código de inicialización del objeto de subproceso, que se ajusta a la documentación. También en el código fuente, es el start()que está llamando a un método natvie, que debe estar haciendo que sucedan cosas relacionadas con el hilo del sistema operativo.

    – Bhesh Gurung

    28 de mayo de 2015 a las 14:44

  • La documentación del constructor de subprocesos es aquí. La fuente de inicialización del objeto Thread es aquí. start() la fuente del método es aquí.

    – Bhesh Gurung

    28 mayo 2015 a las 14:47


Si solo invocas run() directamente, se ejecuta en el subproceso de llamada, como cualquier otra llamada de método. Thread.start() se requiere para crear realmente un nuevo subproceso para que el ejecutable run El método se ejecuta en paralelo.

  • En Hotspot JVM, hay una asignación directa entre el subproceso java y el subproceso nativo. Thread.start() la invocación hace que el estado del subproceso se mueva de nuevo estado a Ejecutable estado. Ejecutable no significa que el hilo se está ejecutando. Una vez que el subproceso nativo se ha inicializado, el subproceso nativo invoca el run() método en el subproceso de Java, que hace que el estado del subproceso cambie de Ejecutable para Corriendo. Cuando el subproceso finaliza, se liberan todos los recursos tanto para el subproceso nativo como para el de Java.

    – sobrecambio

    27/09/2017 a las 18:09


  • @overexchange ¿Dónde puedo encontrar el material sobre el cambio de estado?

    – twlkyao

    1 de febrero de 2018 a las 7:41

1646964370 140 ¿Cual es la diferencia entre Thread start y Runnable run
usuario207421

la diferencia es que Thread.start() inicia un hilo que llama al run() método, mientras Runnable.run() solo llama al run() método en el subproceso actual.

1646964370 242 ¿Cual es la diferencia entre Thread start y Runnable run
Jaimin Patel

La diferencia es que cuando el programa llama start() método, un nuevo el hilo se crea y el código dentro run() se ejecuta en el nuevo hilo: while if you call run() método directamente, no se creará ningún nuevo hilo y código dentro run() se ejecutará en el subproceso actual directamente.

Otra diferencia entre start() y run() en el hilo de Java es que no puedes llamar start() dos veces. Una vez iniciado, segundo start() la llamada se lanzará IllegalStateException en Java mientras puedes llamar run() método varias veces ya que es solo un método ordinario.

1646964371 638 ¿Cual es la diferencia entre Thread start y Runnable run
aditya

Realmente Thread.start() crea un nuevo hilo y tiene su propio escenario de ejecución.

Thread.start() llama al run() método de forma asincrónica, lo que cambia el estado del nuevo subproceso a Runnable.

Pero Thread.run() no crea ningún hilo nuevo. En su lugar, ejecuta el método de ejecución en el subproceso en ejecución actual de forma síncrona.

Si estás usando Thread.run() entonces no está utilizando las funciones de subprocesamiento múltiple en absoluto.

1646964372 742 ¿Cual es la diferencia entre Thread start y Runnable run
ravindra babu

invocar run() se está ejecutando en el subproceso de llamada, como cualquier otra llamada de método. mientras que Thread.start() crea un hilo nuevo. invocando run() es un error programático.

1646964373 780 ¿Cual es la diferencia entre Thread start y Runnable run
imabdullah

Si lo haces run() en el método principal, el subproceso del método principal invocará el run método en lugar del hilo que necesita para ejecutar.

los start() método crea un nuevo hilo y para el cual el run() hay que hacer el metodo

  • El ‘método principal’ no tiene nada que ver con eso.

    – usuario207421

    28 de octubre de 2013 a las 9:25


  • @EJP, por main el escritor se refería al método de llamada. Su respuesta es bastante buena. +1 😉

    – dom_beau

    7 de marzo de 2014 a las 13:46

  • @dom_beau Si eso es lo que quiso decir, debería haberlo dicho. Lo que dijo fue incorrecto. No hay nada “bastante bueno” en esta respuesta. Es solo un lío confuso.

    – usuario207421

    26 mayo 2015 a las 12:27

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad