Java中有趣的线程行为

时间:2014-08-29 09:44:47

标签: java multithreading

我正在学习Java中的多线程概念,在那里我遇到了这个非常有趣的行为。我正在尝试各种创建线程的方法。现在问的是我们正在扩展Thread,而不是实现Runnable接口。

在旁注中,我知道实现Runnable接口而不是扩展Thread类是完全有意义的,但是出于这个问题的目的,让'我们说我们扩展了Thread类。

t成为我的扩展Thread类的实例,我在后台执行的代码块是在我{{1}的run()方法中编写的} .class。

它完全在Thread的背景中运行,但我有点好奇并称为t.start()方法。在主线程中执行的代码片段!

t.run()t.start()没有做什么?

3 个答案:

答案 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>