metodo run nella classe Thread
-
28-10-2019 - |
Domanda
L'output è: RunnableA ThreadB
Non capisco come viene ??(cosa succede nel metodo run nella classe 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();
}
}
Soluzione
Guarda attentamente l'implementazione del metodo run della classe Thread come sotto:
public void run() {
if (target != null) {
target.run();
}
}
Quindi chiamare il metodo run di Thread chiama l'esecuzione del Runnable che viene passato, Nel tuo caso hai passato l'istanza di A durante la creazione di Thread t.Quindi la chiamata a super.run () chiama il metodo run della classe Thread che a sua volta chiama il metodo run della A (che è eseguibile o target).
Altri suggerimenti
Quando chiami super.run()
in B#run
, verrà eseguito Thread#run
e verrà eseguito il successivo metodo run
dell'istanza di Runnable
passato al costruttore.
Thread.run
chiama semplicemente il metodo run
dell'implementazione Runnable
che gli hai fornito.Ma non dovresti MAI chiamare Thread.run
, invece Thread.start
.
Perché hai la sottoclasse B
e hai sovrascritto il suo metodo run()
.
Chiamerà prima il metodo B
.
e nel B
di run()
trova la super chiamata, quindi chiama il super
di run()
(che eseguirà il Runnable
del run()
fornito) e quindi esegue il B
di run()
quando hai creato l'oggetto della classe B e gli hai passato a, il costruttore della classe b è stato chiamato. Cosa c'è nel costruttore di B? super (r); questo imposta r come la super chiamata. ora in generale quando dici t.run () chiama il metodo sovrascritto della classe B che chiama il metodo run dell'oggetto a cui hai associato super dicendo super (r). quindi il metodo run di a viene chiamato prima equindi "ThreadB" viene stampato.