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() :
- 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.
- 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.