質問
出力は次のとおりです。実行可能AスレッドB
どうやって来るのか分かりません??(クラス B の run メソッドで何が起こるか)
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();
}
}
解決
以下のように、Threadクラスのrunメソッドの実装を注意深く参照してください: ジェネラコディセタグプレ
したがって、Threadのrunメソッドを呼び出すと、渡されたRunnableの実行が呼び出されます。この場合、Threadtの作成中にAのインスタンスを渡しました。したがって、super.run()を呼び出すと、Threadクラスのrunメソッドが呼び出され、次にA(実行可能またはターゲット)のrunメソッドが呼び出されます。
他のヒント
super.run()
でB#run
を呼び出すと、Thread#run
が実行され、コンストラクターに渡されたrun
のインスタンスの次のRunnable
メソッドが実行されます。
Thread.run
単に呼び出すだけです run
の方法 Runnable
あなたが与えた実装。でも絶対に電話してはいけません Thread.run
, 、代わりに呼び出します Thread.start
.
サブクラスB
があり、そのメソッドrun()
をオーバーライドしているため。
最初にB
のメソッドを呼び出します。
そしてB
のrun()
でスーパーコールを見つけるので、最初にsuper
のrun()
(提供されたRunnable
のrun()
を実行します)を呼び出し、次にB
のrun()
を実行します
クラスBのオブジェクトを作成し、それにaを渡すと、クラスbのコンストラクターが呼び出されました。Bのコンストラクターはどうなっていますか? super(r); これにより、rがスーパーコールに設定されます。 現在メインでは、t.run()と言うと、super(r)と言ってsuperをバインドしたオブジェクトのrunメソッドを呼び出すクラスBのオーバーライドされたメソッドを呼び出します。したがって、aのrunメソッドが最初に呼び出され、次に、「ThreadB」が出力されます。