Thread与Runnable的一个小陷阱
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()方法并没有机会被调用到。