2012-01-16 8 views
0

出力は次のとおりです。RunnableA ThreadB
どのようになるのですか?あなたはそれはあなたが実行されるコンストラクタに渡されたRunnableのインスタンスののThread#runと次runメソッドを実行しますB#runsuper.run()を呼び出したようスレッドクラスの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(); 
    } 
} 

答えて

1

下のように慎重にそのThreadクラスのrunメソッドの実装を参照してください:だからあなたのケースではあなたが合格した、スレッドのrunメソッドが渡されたRunnableの実行を呼び出し、呼び出し

public void run() { 
    if (target != null) { 
     target.run(); 
    } 
    } 

スレッドtを作成しながらAのインスタンス。したがって、super.run()を呼び出すと、Threadクラスのrunメソッドが呼び出されます。このメソッドは、A(実行可能またはターゲット)のrunメソッドを呼び出します。

3

(何がクラスBでのrunメソッドで発生します)。

1

サブクラスがBであり、そのメソッドrun()がオーバーライドされているためです。

最初にBのメソッドを呼び出します。

Bに「それが呼び出すよう秒run()それはスーパーコールを見つけるsuperrun()(実行されてRunnableさんrun())最初にしてBが実行のrun()

2

Thread.runは、単にrunを呼び出しますあなたがそれを与えた実装の方法。しかし、決してThread.runに電話をかけてはならず、代わりにThread.startを呼び出してください。

0

クラスBのオブジェクトを作成してそれを渡すと、クラスBのコンストラクタがBのコンストラクタの.Whatsと呼ばれましたか? super(r); これは、rをスーパーコールに設定します。 今あなたがt.run()と言うとき、super(r).soと言ってあなたがスーパーバインドしたオブジェクトのrunメソッドを呼び出すBクラスのオーバーライドされたメソッドを呼び出します。 「ThreadB」が印刷されます。

関連する問題