質問

出力は次のとおりです。実行可能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のメソッドを呼び出します。

そしてBrun()でスーパーコールを見つけるので、最初にsuperrun()(提供されたRunnablerun()を実行します)を呼び出し、次にBrun()を実行します

クラスBのオブジェクトを作成し、それにaを渡すと、クラスbのコンストラクターが呼び出されました。Bのコンストラクターはどうなっていますか? super(r); これにより、rがスーパーコールに設定されます。 現在メインでは、t.run()と言うと、super(r)と言ってsuperをバインドしたオブジェクトのrunメソッドを呼び出すクラスBのオーバーライドされたメソッドを呼び出します。したがって、aのrunメソッドが最初に呼び出され、次に、「ThreadB」が出力されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top