我有一个名为MyThread的类,它扩展了Thread类并实现了run() function.When,我想运行它,我有两种方法:
new MyThread().start()(new Thread(new MyThread)).start();有谁能说出区别吗?
发布于 2013-11-26 08:13:41
嗯,你有两种方法来实现多线程。
Thread并使用new MyThreand().start()启动线程。Runnable接口。在这种情况下,可以使用(new Thread(new MyThread)).start();启动线程。有关详细信息,只需参考甲骨文官方医生。
发布于 2013-11-26 08:12:32
因为您已经说过您的类扩展了Thread,所以第二个类有点多余。在第二个示例中,您不是将类用作Thread,而是将其用作Runnable。
通常,您可以扩展Thread,然后调用它自己的start (您的#1)、或--您将实现Runnable,然后使用Thread来运行它(您的#2)。但是您不会扩展Thread,然后使用另一个Thread来运行它。
就不同之处而言,如果您需要做任何事情来控制或询问线程,那么在第一种情况下,您将对类的实例使用Thread方法;在第二种情况下,您将在用new Thread创建的实例上使用它们。如果扩展Thread,但通过#2运行它,则实例上的Thread方法是不相关的,可能会引起混淆。
最后一点可能更清楚,举个例子:
扩展Thread的示例
class Foo extends Thread {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Start it
foo.start();
// Wait for it to finish (for example)
foo.join();注意,我们通过foo引用启动并加入了线程。
实现Runnable的示例
class Foo implements Runnable {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Create a Thread to run it
Thread thread = new Thread(foo);
// Start it
thread.start();
// Wait for it to finish (for example)
thread.join();注意,我们通过thread引用启动并加入了线程。
别这么做:
class Foo extends Thread {
public void run() {
// ...
}
}
// Create it
Foo foo = new Foo();
// Create a Thread to run it -- DON'T do this
Thread thread = new Thread(foo);
// Start it
thread.start();...because现在您在foo和thread上都有可用的Thread#join;哪个是合适的?(答案是:thread上的那个,但令人困惑,所以最好不要这么做。)
发布于 2013-11-26 08:12:53
您传递的MyThread实例只是充当Runnable,而不是作为单独的线程。
这两种方式在逻辑上基本上没有区别:
Thread内部在start()上所做的是,调用Runnable的run()方法。
当您执行new Thread(new MyThread()).start()时,您只是多余的,因为Thread本身实现了Runnable。
但这在逻辑上没有什么区别,因为新线程将调用MyThread的MyThread方法。
https://stackoverflow.com/questions/20211528
复制相似问题