Diferencia entre Thread.start() y Thread.run() en Java

En el concepto de subprocesos múltiples de Java , start() y run() son los dos métodos más importantes. A continuación se muestran algunas de las diferencias entre los métodos Thread.start() y Thread.run() :

  1. Creación de un nuevo subproceso: cuando un programa llama al método start() , se crea un nuevo subproceso y luego se ejecuta el método run() . Pero si llamamos directamente al método run() , no se creará un nuevo subproceso y el método run() se ejecutará como una llamada de método normal en el subproceso de llamada actual y no se realizarán subprocesos múltiples.
    Entendámoslo con un ejemplo:

    class MyThread extends Thread {
        public void run()
        {
            System.out.println("Current thread name: "
                               + Thread.currentThread().getName());
            System.out.println("run() method called");
        }
    }
      
    class GeeksforGeeks {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
            t.start();
        }
    }
    Producción:

    Current thread name: Thread-0
    run() method called
    

    Como podemos ver en el ejemplo anterior, cuando llamamos al método start() de nuestra instancia de clase de hilo, se crea un nuevo hilo con el nombre predeterminado Thread-0 y luego se llama al método run() y todo lo que contiene se ejecuta en el hilo recién creado.
    Ahora, intentemos llamar al método run() directamente en lugar del método start() :

    class MyThread extends Thread {
        public void run()
        {
            System.out.println("Current thread name: "
                               + Thread.currentThread().getName());
      
            System.out.println("run() method called");
        }
    }
      
    class GeeksforGeeks {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
            t.run();
        }
    }
    Producción:

    Current thread name: main
    run() method called
    

    Como podemos ver en el ejemplo anterior, cuando llamamos al método run() de nuestra clase MyThread, no se crea ningún nuevo hilo y el método run() se ejecuta en el hilo actual, es decir, el hilo principal . Por lo tanto, no se realizaron subprocesos múltiples. El método run() se llama como una llamada de función normal.

  2. Invocación múltiple: en el concepto de subprocesos múltiples de Java, otra diferencia más importante entre el método start() y run() es que no podemos llamar al método start() dos veces, de lo contrario arrojará una excepción IllegalStateException mientras que se puede llamar al método run() varias veces, ya que es solo una llamada de método normal.
    Entendámoslo con un ejemplo:

    class MyThread extends Thread {
        public void run()
        {
            System.out.println("Current thread name: "
                               + Thread.currentThread().getName());
      
            System.out.println("run() method called");
        }
    }
      
    class GeeksforGeeks {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
            t.start();
            t.start();
        }
    }

    Salida :

    Current thread name: Thread-0
    run() method called
    Exception in thread "main" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:708)
        at GeeksforGeeks.main(File.java:11)
    

    Como podemos ver en el ejemplo anterior, llamar al método start() nuevamente genera java.lang.IllegalThreadStateException .
    Ahora, intentemos llamar al método run() dos veces:

    class MyThread extends Thread {
        public void run()
        {
            System.out.println("Current thread name: "
                               + Thread.currentThread().getName());
            System.out.println("run() method called");
        }
    }
      
    class GeeksforGeeks {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
            t.run();
            t.run();
        }
    }
    Producción:

    Current thread name: main
    run() method called
    Current thread name: main
    run() method called
    

    Como podemos ver en el ejemplo anterior, llamar dos veces al método run() no genera ninguna excepción y se ejecuta dos veces como se esperaba, pero en el hilo principal .

    Resumen

    comienzo() correr()
    Crea un nuevo subproceso y el método run() se ejecuta en el subproceso recién creado. No se crea ningún subproceso nuevo y el método run() se ejecuta en el propio subproceso de llamada.
    No se puede invocar más de una vez, de lo contrario arroja java.lang.IllegalStateException Es posible la invocación múltiple
    Definido en la clase java.lang.Thread . Se define en la interfaz java.lang.Runnable y debe anularse en la clase de implementación.

Publicación traducida automáticamente

Artículo escrito por raman_257 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *