ejecutar el método en la clase Thread
-
28-10-2019 - |
Pregunta
El resultado es: RunnableA ThreadB
No entiendo como viene(qué sucede en el método de ejecución en la clase B)
class A implements Runnable{
public void run(){
System.out.println("RunnableA");
}
}
class B extends Thread{
B(Runnable r){
super(r);
}
public void run(){
super.run();
System.out.println("ThreadB");
}
}
class Demo{
public static void main (String []args){
A a=new A();
Thread t=new B(a);
t.run();
}
}
Solución
Vea detenidamente la implementación del método de ejecución de la clase Thread como se muestra en:
public void run() {
if (target != null) {
target.run();
}
}
Entonces, llamar al método run de Thread llama a la ejecución del Runnable que se pasa. En su caso, ha pasado la instancia de A mientras creaba Thread t.Entonces, llamar a super.run () llama al método de ejecución de la clase Thread, que a su vez llama al método de ejecución de A (que es ejecutable o el objetivo).
Otros consejos
Cuando llame a super.run()
en B#run
, se ejecutará Thread#run
y se ejecutará el siguiente método run
de la instancia de Runnable
que pasó al constructor.
Thread.run
simplemente llama al método run
de la implementación Runnable
que le dio.Pero NUNCA debe llamar a Thread.run
, en su lugar llame a Thread.start
.
Porque tiene la subclase B
y anuló su método run()
.
Primero llamará al método B
.
y en B
de run()
encuentra la super llamada para que llame al super
de run()
(que ejecutará el Runnable
del run()
proporcionado) primero y luego ejecutará B
de run()
cuando creaste el objeto de la clase B y le pasaste a, se llamó al constructor de la clase b. ¿Qué hay en el constructor de B? super (r); esto establece que r sea la súper llamada. ahora en main cuando dices t.run (), llama al método anulado de la clase B que llama al método de ejecución del objeto con el que has enlazado super diciendo super (r). Así que el método de ejecución de a se llama primero yluego se imprime "ThreadB".