método de execução na classe Thread
-
28-10-2019 - |
Pergunta
O resultado é: RunnableA ThreadB
Eu não entendo como isso vem ??(o que acontece no método run na 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();
}
}
Solução
Veja cuidadosamente a implementação do método run da classe Thread como em:
public void run() {
if (target != null) {
target.run();
}
}
Portanto, chamar o método run de Thread chama a execução do Runnable que é passado. No seu caso, você passou a instância de A ao criar Thread t.Portanto, a chamada para super.run () chama o método run da classe Thread que, por sua vez, chama o método run do A (que pode ser executado ou o destino).
Outras dicas
Conforme você chama super.run()
em B#run
, ele executará Thread#run
e o próximo método run
da instância de Runnable
que você passou para o construtor será executado.
Thread.run
simplesmente chama o método run
da implementação Runnable
que você forneceu.Mas você NUNCA deve chamar Thread.run
, em vez disso, chame Thread.start
.
Porque você tem a subclasse B
e substituiu seu método run()
.
Ele chamará primeiro o método B
.
e no B
do run()
, ele encontra a super chamada para que chame super
run()
(que executará o Runnable
fornecido run()
) primeiro e, em seguida, execute B
run()
quando você criou o objeto da classe B e passou a para ele, o construtor da classe b foi chamado. O que está no construtor de B? super (r); isso define r como a super chamada. agora, em main, quando você diz t.run (), ele chama o método sobrescrito da classe B, que chama o método run do objeto ao qual você vinculou super dizendo super (r). então o método run de a é chamado primeiro eentão "ThreadB" é impresso.