なぜJAVAでrunnableインタフェースのrunメソッドがサブスレッドで実行されるのですか?

1467 ワード

次のコードを分析します.
new Thread(new Runnable() {
       @Override
       public void run() {
         System.out.println("Runnable     run  ");
       }
     }) {
       @Override
       public void run() {
         System.out.println("Thread     run  ");
       }
     }.start();

出力は:Thread匿名サブクラスのrunメソッド
 
理由は次のとおりです.
1.まず、Threadの匿名の内部クラスオブジェクトを作成しました.
2.匿名ThreadサブクラスオブジェクトはRuannableインタフェースサブクラスの匿名内部クラスオブジェクトを受信する
3.Threadサブクラスの匿名内部クラス定義では、親クラス(Thread)のrunメソッドを上書きします.
4.次に、Threadの匿名内部クラスオブジェクト上でstart()メソッドを呼び出し、このThreadの匿名内部クラスオブジェクトが表すサブスレッドを起動する
5.このサブスレッド(つまりThreadの匿名内部クラスオブジェクト)でstart()メソッドを呼び出すと、start()メソッドはThreadクラスのrun()メソッドを呼び出すが、このrunメソッドはThreadの匿名サブクラス定義でクラスに上書きされる.したがって,実際にサブスレッドで実行するのはThreadクラスのrun()メソッドではなく,Threadの匿名サブクラスで定義されたrun()メソッド(すなわちマルチステート効果)である.
 
説明2:
New Runnableの匿名サブクラスオブジェクトがThreadの構築方法に渡され、target参照変数に値が付与され、targe参照変数は最後にThreadクラスのRunメソッドを構成するが、Threadの匿名内部クラスオブジェクトであるThreadのサブクラスは親ThreadのRunメソッドを書き換え、上書きを実現するのでRunnale匿名サブクラスのrunメソッドは出力されず、