你能解释一下这个Thread工作吗?

时间:2013-10-14 08:42:13

标签: java multithreading runnable ocpjp

继承关于线程的代码.....我不知道这两个new()语句之间的区别。

  Runnable r=new Runnable() {
    public void run() {
    System.out.print("Cat");
    }
    };

    Thread t=new Thread(r) {
    public void run() {
    System.out.println("Dog");
    }
    };
    t.start();

输出是狗 但为什么以及如何?

7 个答案:

答案 0 :(得分:3)

因为您覆盖Thread#run(),所以在启动线程时最终会执行此方法。默认Thread#run()委托传入的Runnable。经验法则:提供Runnable或覆盖Thread#run(),但不要同时执行这两项操作!

答案 1 :(得分:1)

在线程t中,覆盖传递给它的runnable的run方法。我想这就是为什么当你调用一个有runnable的线程的开头并且没有调用它的run方法时!

答案 2 :(得分:1)

在第一个“new”语句中,您创建一个Runnable实例,稍后您将通过第二个“new”语句创建一个Thread。输出是dog,就像你创建Thread的第二个“new”语句一样,你也重写了run()方法,这必须优先于你传入的Runnable中run()的实现。 这意味着您的Run()runnable实现了打印Cat从未使用过,只有run()实现打印Dog被Thread调用。

答案 3 :(得分:0)

更改为:

Runnable r=new Runnable() {
public void run() {
System.out.print("Cat");
}
};

Thread t=new Thread(r);
t.start();

这应该打印“Cat”

答案 4 :(得分:0)

在为实例t创建Thread对象时,您已覆盖run()方法。所以调用t.start()将执行重写方法。因此输出为Dog而不是Cat

答案 5 :(得分:0)

将其更改为:

new Thread(new Runnable() {
    public void run() {
        System.out.print("Cat");
    }
}).start();

Runnable接口提供了一种使用Thread类的替代方法,适用于无法使类扩展Thread类的情况。当我们的类,我们想要在一个单独的线程上运行时,应该扩展其他一些类。由于没有多重继承,我们的类不能同时扩展Thread类和另一个。在这种情况下,您的类必须实现Runnable接口。

答案 6 :(得分:0)

由于Runnable是一个接口而Thread是一个类,因此JVM如何管理它们之间存在一些差异。

- 如果您实现了Runnable接口,则线程之间将共享一个唯一的对象。

- 扩展Thread类,每个线程都会创建一个对象。

在某些情况下,runnable将比Thread消耗更少的内存。 此外,我认为如果你扩展一个类,那是因为你想要覆盖一些方法,所以从我的观点来看,如果你不修改Thread类的任何方法或行为,你应该使用Runnable ..

希望它有所帮助。