继承关于线程的代码.....我不知道这两个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();
输出是狗 但为什么以及如何?
答案 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 ..
希望它有所帮助。