Realmente muito estranho
Sabemos que a chamada de super() no primeiro construtor é inútil, mas no segundo faz sentido, mas parece que ele ignora esta chamada.
Mesmo sendo forçado ele continua com a mesma saida
assim:
public MyThread(Runnable runnable) {
//super(runnable);
super( new MyRunnable() );
System.out.println("construtor 2");
}
Na verdade, o que pude entender é que o java dá prioridade para uma herança sobre uma implementação.
Quando nós passamos uma classe que extende Runnable para Thread, esta classe sabe que nada há no método run da classe Thread, e por isso chama o método run da Runnable que foi passada.
Já quando há uma herança, ele ignora a classe Runnable passada, e executa o run da classe.
Teste o código seguinte:
public class MyThread extends Thread {
public MyThread(){}
public MyThread(Runnable runnable) {
super(runnable);
}
public static void main(String... args) {
//new MyThread().start();
new MyThread(new MyRunnable()).start();
new Thread(new MyRunnable()).start();
}
}
class MyRunnable implements Runnable {
public void run() {
System.out.println("alou from MyRunnable");
}
}
e terá duas saídas alou from MyRunnable