2013-10-14 204 views
0

继承人关于线程的代码.....我不知道这两个新()语句之间的区别。你能解释一下这个线程的工作吗?

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

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

+0

你没有启动可运行 – tom

回答

3

因为您覆盖了Thread#run(),所以最终在您启动线程时执行此方法。默认Thread#run()代表到达Runnable。经验法则:提供Runnable或覆盖Thread#run(),但不要同时做!

+1

其实经验法则是从不创建线程的子类开始,很少有这样做的理由 – Voo

+0

同意,将'Runnable'传递给'Thread'会导致更清洁设计在解耦方面。但不幸的是(可能是因为遗留原因)类Thread不是最终的,因为它可能应该是。实际上,根本不应该使用原始线程(除了学习Java线程编程的基础知识外); Java新的并发框架为多线程编程提供了更好(更安全)的抽象。 –

0

变化:

​​

本应打印“猫”

1

在线程t,重写的被传递给它运行的run方法。我认为这就是为什么当你调用一个具有可运行的线程的开始并且它的运行方法未被调用时!

0

创建线程对象时,例如t您已覆盖run()方法。所以调用t.start()将执行重写的方法。所以输出Dog而不是Cat

0

将其更改为:

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

Runnable接口提供了一种替代的方法来利用Thread类,针对案件中,它不可能让你的类扩展了Thread类。发生这种情况时,我们的类,我们想要在一个单独的线程上运行应扩展一些其他类。由于没有多重继承,我们的类不能同时扩展Thread类和其他类。在这种情况下,你的类必须实现Runnable接口。

1

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

0

由于Runnable是一个接口,Thread是一个类,所以JVM管理它们的方式有些不同。

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

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

在某些情况下,runnable将占用比Thread更少的内存。 此外,我认为如果你扩展一个类,这是因为你想重写一些方法,所以从我的角度来看,如果你不会修改Thread类的任何方法或行为,你应该使用Runnable ..

希望它有帮助。

相关问题