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()方法并没有机会被调用到。

 

posted @ 2016-11-10 11:47  schbook  阅读(226)  评论(0编辑  收藏  举报