线程创建和启动

时间:2013-03-21 12:07:13

标签: java

之间有区别吗?
class MyThread extends Thread
{
}

MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()

Vs的

obj.start()

选择一个优于其他优势是否有优势?

6 个答案:

答案 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();

确保区分ThreadRunnable的概念:前者是实际系统资源的重量级句柄;后者只是方法的持有者。

答案 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的线程池,执行程序等。稍后提交给线程的对象。