我正在学习Java中的多线程概念,在那里我遇到了这个非常有趣的行为。我正在尝试各种创建线程的方法。现在问的是我们正在扩展Thread
,而不是实现Runnable
接口。
在旁注中,我知道实现Runnable
接口而不是扩展Thread
类是完全有意义的,但是出于这个问题的目的,让'我们说我们扩展了Thread
类。
让t
成为我的扩展Thread
类的实例,我在后台执行的代码块是在我{{1}的run()
方法中编写的} .class。
它完全在Thread
的背景中运行,但我有点好奇并称为t.start()
方法。在主线程中执行的代码片段!
t.run()
做t.start()
没有做什么?
答案 0 :(得分:8)
这就是班级的作用。 t.start()实际上将启动一个新线程,然后在该线程中调用run()。如果直接调用run(),则在当前线程中运行它。
public class Test implements Runnable() {
public void run() { System.out.println("test"); }
}
...
public static void main(String...args) {
// this runs in the current thread
new Test().run();
// this also runs in the current thread and is functionally the same as the above
new Thread(new Test()).run();
// this starts a new thread, then calls run() on your Test instance in that new thread
new Thread(new Test()).start();
}
这是预期的行为。
答案 1 :(得分:1)
t.start()
完全按照其说法执行:启动一个新线程,执行run()
部分代码。 t.run()
是一个对象的函数调用,来自当前工作线程(在您的情况下,主线程)。
请记住:只有在线程调用start()
函数时,才会启动新线程,否则调用它的函数(start()
除外)与调用相同任何其他不同对象的普通函数。
答案 2 :(得分:0)
t.start()
进行本机调用以在新线程中实际执行run()
方法。 t.run()
仅执行当前线程中的run()
。
现在,
在旁注中,我知道实现Runnable接口比扩展Thread类
更完美。实际上,它使完美 OO意识到遵循任何一种方法(实现Runnable或扩展Thread)。在OO意义上,这不是一个坏的。 实现Runnable 所带来的好处是,您可以使您的类扩展另一个类(可能实际上破坏了您的OO设计。)< / p>