Thread实例不调用run()方法

时间:2018-03-11 07:14:46

标签: java multithreading

我已经开始学习Java中的多线程。我正在编写用于创建Thread的程序。

public class CreateThread extends Thread{
    public static void main(String[] args) {

    **Thread t1 = new Thread();
       t1.start()**;                //   This does not call run method

        CreateThread t1 = new CreateThread();
        t1.start();                  // This calls run method
    }

    public void run() {
        System.out.println("Thread started");
    }   
}

如果CreateThread实例调用了start(),则调用run方法。 但是如果Thread实例调用了start()(用粗体字母突出显示),则不调用run方法。

即使Thread类的实例是单独的线程,那么为什么不调用run()。 请解释如何在Java内部创建线程。

2 个答案:

答案 0 :(得分:2)

我认为你对继承和多态有一些误解。你好像把它们搞混了。

  

CreateThread是Thread的子类。如果CreateThread实例可以调用run()那么为什么Thread的实例不能调用?

因为此处没有CreateThread的对象:

Thread t1 = new Thread();

如果您将CreateThread对象放入Thread变量,并拨打start,则会调用run

Thread t1 = new CreateThread();
t1.start();

这是因为t1实际上拥有CreateThread个对象。

继承允许您将CreateThread对象分配给Thread变量。可以将派生类的实例分配给基类的变量。

能够在start变量上调用Thread并看到被调用run的{​​{1}}方法归因于多态性。< / p>

答案 1 :(得分:0)

您的代码

Thread t1 = new Thread();
t1.start()

致电run(),但它正在呼叫Thread.run(),而不是CreateThread.run()(因为您已将t1设为Thread 1}},而不是CreateThread