线程创建现象与启动它们之间的差异

时间:2014-11-10 13:06:12

标签: java multithreading runnable

以下代码中两个线程创建之间的区别是什么:

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

    }   
}

两者都给了我相同的输出。

5 个答案:

答案 0 :(得分:3)

在两种情况下,线程实例的类型不同 - MyThreadThread - 但启动线程时要执行的run方法将是相同的。

使用Thread创建new Thread(m)时,您不必传递Thread个实例。您只需传递实现Runnable接口的实例。

答案 1 :(得分:1)

最终是同样的行为。

Thread实现RunnableThread具有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时,你知道你正在处理委托。