Java里面运行一个线程可以通过继承Thread的方式,也可以通过实现Runnable的接口来实现,那么两者能不能混用呢,比如以下的例子:
public class JavaTest extends Thread{
public JavaTest(Runnable target) {
super(target);
}
public void run() {
System.out.println("run() in JavaTest thread.");
}
public static void main(String[] args) throws Exception {
new JavaTest(new Runnable() {
public void run() {
System.out.println("run() in Runnable.");
}
}).start();
}
}
这段代码运行后,最终打印出了“run() in JavaTest thread”,为什么没有执行Runnable里面的run()方法呢,分析一下Thread的源码发现,其实Thread的构造函数接收Runnbale对象之后保存至一个名为target的私有变量,而Thread的run()方法调用了target的run()来执行,如下面的代码所示:
public void run() {
if (target != null) {
target.run();
}
}
而JavaTest类继承Thread之后覆写了run()方法,所以Runnbale所实现的run()方法并没有机会被调用到。