我已经开始学习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内部创建线程。
答案 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
)