新しいスレッドを作成するときに、我々はRunnableをターゲットを供給した場合、そのスレッドの.start()
が実行可能な供給のrun()
方法を実行することをJava docs状態。java.lang.Threadは、起動時に明示的なjava.lang.Runnableのrun()メソッドを呼び出さないのはなぜですか?
この場合、このテストコードでは "b"を印刷するのではなく "a"が印刷されるべきですか?
public class test {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("a");
}
};
Thread t = new Thread(r) {
@Override
public void run() {
System.out.println("b");
}
};
t.start();
}
}
これはドキュメントのフレーズエラーではありませんか? Javaドキュメントのhttp://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#Thread%28java.lang.Runnable%29では、作成時にRunnableターゲットを指定した場合、新しいスレッド、そのスレッドの.start()は、(スレッドのrun()メソッドをオーバーライドしているかどうかにかかわらず)指定された実行可能ファイルのrun()メソッドを実行します。それは私がしたことですが、その行動は「定義された」ものではありません。 – Pacerier
まあ厳密に言うと、Thread.run()メソッドが提供するものであり、オーバーライドされた可能性のある機能ではないので、ドキュメントは明確です。 – user802421
他の方法と同様です。メソッドがfinal宣言されていない場合は、契約をオーバーライドして中断することができます。 – user802421