0

有没有区别

class MyThread extends Thread
{
}

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

VS

obj.start()

选择一个比另一个有什么优势吗?

4

6 回答 6

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()
于 2013-03-21T12:10:51.390 回答
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前者是实际系统资源的重量级句柄;后者只是一个方法的持有者。

于 2013-03-21T12:11:05.587 回答
2

Thread t = new Thread(obj);采取Runnable obj- 推荐的方式。

MyThread obj = new MyThread();要求你现在extend Thread认为是不可取的。

有关辩论的详细信息,请参阅“实现可运行”与“扩展线程” 。

于 2013-03-21T12:10:35.467 回答
1

这似乎充其量是令人困惑的。

我宁愿实现Runnable接口,然后该对象不仅可以用于Thread构造函数,还可以用于线程池、执行器等,这些线程池、执行器等使用Runnable对象以在以后提交给线程。

于 2013-03-21T12:11:28.753 回答
1

您的对象已经扩展了 Thread,因此无需将其包装在新的 Thread 对象中。如果您要实现 Runnable,则第一种方法是正确的。

于 2013-03-21T12:09:17.320 回答
1

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(在某些情况下很方便)的默认实现。

于 2013-03-21T12:10:07.640 回答