实现Runnable并扩展Thread类

时间:2016-07-27 23:40:20

标签: java multithreading

我知道有两种方法可以通过实现Runnable接口扩展Thread类来创建新的Thread。我写了一个实现Runnable接口的简单程序。

public class tp implements Runnable {

    public void run() {
        System.out.println("Hello from "+ Thread.currentThread().getName());
    }

    public static void main(String args[]) {
        tp o1= new tp();
        Thread t1 = new Thread(o1);
        Thread t2 = new Thread(o1);
        System.out.println(Thread.currentThread().getName());
        t1.start();
        t2.start();
        //(new Thread(new tp())).start();
    }

}

它有以下输出:

main
Hello from Thread-0
Hello from Thread-1

然后我扩展了课程。

public class tp extends Thread {

    public void run() {
        System.out.println("Hello from "+ Thread.currentThread().getName());
    }

    public static void main(String args[]) {
        tp o1= new tp();
        Thread t1 = new Thread(o1);
        Thread t2 = new Thread(o1);
        System.out.println(Thread.currentThread().getName());
        t1.start();
        t2.start();
        //(new Thread(new tp())).start();
    }

}

产生了这个输出:

main
Hello from Thread-1
Hello from Thread-2

我无法理解为什么线程名称在我实现接口时使用Thread-0开始,而在扩展Thread类时使用Thread-1。

1 个答案:

答案 0 :(得分:1)

在第二个示例中,tp类调用其父构造函数。由于其父级为Threadtp +中的main对象会获得第一个自动分配的名称(Thread-0)。

您永远不应该依赖自动生成的名称。如果名称对您很重要,请拨打Thread constructor that allows you to set your own name

+旁注:不要将类和变量命名为引入歧义的名称。