我有一个名为 MyThread
的类,它扩展了 Thread 类并实现了 run()
函数。当我想运行它时,我有两种方法:
- 新建一个实例并调用函数,如:
new MyThread().start()
- 新建一个实例并将该实例作为参数传递给Thread的构造函数,然后调用Thread的start函数。像这样:
(new Thread(new MyThread)).start();
谁能说出区别?
最佳答案
因为您说过您的类(class)扩展 Thread
,第二个有点多余。在您的第二个示例中,您没有将您的类(class)用作 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();
...因为现在你有 Thread#join
可用于 foo
和 thread
;哪个是正确的使用? (答案是:thread
上的那个,但很容易混淆,所以最好不要那样做。)
关于java - 不同的线程启动方式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20211528/