以下代码中两个线程创建之间的区别是什么:
public class MyThread extends Thread
{
int a=0;
public void run()
{
System.out.println("Some Thread");
}
public static void main(String[] args)
{
MyThread m=new MyThread();
Thread t=new Thread(m);
m.start(); //what is difference between this
t.start(); //and this
}
}
两者都给了我相同的输出。
答案 0 :(得分:3)
在两种情况下,线程实例的类型不同 - MyThread
与Thread
- 但启动线程时要执行的run
方法将是相同的。
使用Thread
创建new Thread(m)
时,您不必传递Thread
个实例。您只需传递实现Runnable
接口的实例。
答案 1 :(得分:1)
最终是同样的行为。
Thread
实现Runnable
,Thread
具有Runnable
的构造函数。因此new Thread(m);
使用其参数的Runnable
实现。但最终使用相同的run
方法,只有Thread
个实例不同。
答案 2 :(得分:1)
如果您已创建
Thread t = new Thread();
然后run方法不会执行任何操作,因为Thread
的run方法是
@Override
public void run() {
if (target != null) {
target.run();
}
}
目标为null。 如果您传递目标
Thread t = new Thread(target)
然后线程将执行目标的run方法。
如果您已延长MyThread
,则run
中的MyThread
方法将执行
答案 3 :(得分:1)
将Runnable实现传递给Thread并将其作为Thread启动有几种可能性,但在您的示例中,它只使用了一些额外的CPU时间。在下面的情况下使用是有意义的。
class MyClass extends OtherClass implements Runnable { .. }
MyClass mm = new MyClass(..);
Thread t = new Thread(mm);
...
答案 4 :(得分:1)
当您将Runnable对象传递给Thread(r)构造函数时,Runnable将成为线程的委托。目前,委托被认为是一种比继承更强大,更灵活的组织程序的方式。在没有多重继承的Java中尤其如此。
当您为线程提供委托时,委托也可以从其他类继承(如user2794960的示例所示)。但是如果你让你的“线程”类继承自Thread,那么它也不能继承任何其他类。
当你说Foo 一个Bar而不是说Foo 是一个Bar时,你知道你正在处理委托。