之间有区别吗?
class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
Vs的
obj.start()
选择一个优于其他优势是否有优势?
答案 0 :(得分:5)
一般情况下,您不应展开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()
答案 1 :(得分:3)
是的,存在差异:您应不扩展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
的概念:前者是实际系统资源的重量级句柄;后者只是方法的持有者。
答案 2 :(得分:2)
Thread t = new Thread(obj);
采用Runnable obj
- 推荐方式。
MyThread obj = new MyThread();
要求您extend
Thread
现在被认为是不可取的。
有关辩论的详情,请参阅"implements Runnable" vs. "extends Thread"。
答案 3 :(得分:1)
您的对象已经扩展了Thread,因此无需将其包装在新的Thread对象中。如果您正在实现Runnable,那么第一种方法是正确的。
答案 4 :(得分:1)
new Thread(obj)
代理人Thread.run
加入obj
。这仅使用obj
作为Runnable
而不是Thread
。
MyRunnable obj = new MyRunnable();
Thread t = new Thread(obj);
t.start();
由于(在您的代码中)您正在实例化两个线程(一个已启动,另一个从未启动,因此您需要为创建其他线程支付一些费用)。除此之外,具有runnable的表单可以带来更好的设计,因为您不会将Thread
扩展为覆盖run
的唯一目的。
如果您使用Runnable
实现了逻辑,那么您将能够使用ThreadFactory
,并且您将不再依赖Thread
的默认实现(这在某些方面很方便)情况)。
答案 5 :(得分:1)
这似乎令人困惑。
我宁愿实现Runnable接口,然后该对象不仅可以用于Thread
构造函数,还可以用于消耗Runnable
的线程池,执行程序等。稍后提交给线程的对象。