有没有区别
class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
VS
obj.start()
选择一个比另一个有什么优势吗?
有没有区别
class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
VS
obj.start()
选择一个比另一个有什么优势吗?
一般来说,您不应该扩展Thread
,而是实施Runnable
。您的示例将变为:
class MyRunnable implements Runnable {
public void run() {
// Whatever needs to be done.
}
}
MyRunnable obj = new MyRunnable();
Thread t = new Thread(obj);
t.start()
是的,有一个区别:你不应该扩展,Thread
而是使用new Thread(myRunnable)
. 这类似于您的第一种方法,只是您的方式在扩展 Thread 而不是实现 Runnable 方面被误导了。所以这样做:
class MyRunnable implements Runnable {
public void run() { ... }
}
Thread t = new MyThread(new MyRunnable());
t.start();
或者,更方便的是,
new Thread(new Runnable() { public void run() {
... stuff ...
}}).start();
一定要区分 和 的概念Thread
:Runnable
前者是实际系统资源的重量级句柄;后者只是一个方法的持有者。
Thread t = new Thread(obj);
采取Runnable obj
- 推荐的方式。
MyThread obj = new MyThread();
要求你现在extend
Thread
被认为是不可取的。
有关辩论的详细信息,请参阅“实现可运行”与“扩展线程” 。
这似乎充其量是令人困惑的。
我宁愿实现Runnable接口,然后该对象不仅可以用于Thread
构造函数,还可以用于线程池、执行器等,这些线程池、执行器等使用Runnable
对象以在以后提交给线程。
您的对象已经扩展了 Thread,因此无需将其包装在新的 Thread 对象中。如果您要实现 Runnable,则第一种方法是正确的。
new Thread(obj)
代表. Thread.run
_ obj
这仅用obj
作 aRunnable
而不是用作 a Thread
。
MyRunnable obj = new MyRunnable();
Thread t = new Thread(obj);
t.start();
由于(在您的代码中)您正在实例化两个线程(一个已启动,一个从未启动,因此您为创建额外的线程支付了一些成本)。除此之外,带有 runnable 的表单会带来更好的设计,因为您扩展Thread
的唯一目的不是覆盖run
.
如果您使用 实现了您的逻辑Runnable
,您将能够使用ThreadFactory
,并且您将不再受制于Thread
(在某些情况下很方便)的默认实现。