先看段代码:
public class ThreadDemo
{
public static void main(String[] args)
{
new Thread(new Runnable()
{
@Override
public void run()
{
while(true)
{
System.out.println("Runnable:"+Thread.currentThread().getName());
}
}
})
{
public void run()
{
while(true)
{
System.out.println("Thread:"+Thread.currentThread().getName());
}
}
}.start();
}
}
结果如下:
Thread:Thread-0
Thread:Thread-0
Thread:Thread-0
Thread:Thread-0
Thread:Thread-0
...
再看段代码:
public class ThreadDemo
{
public static void main(String[] args)
{
new Thread(new Runnable()
{
@Override
public void run()
{
while(true)
{
System.out.println("Runnable:"+Thread.currentThread().getName());
}
}
})
{
public void run()
{
System.out.println("Thread子类run()方法在运行");
}
}.start();
}
}
结果如下:
Thread子类run()方法在运行
最后再看段代码:
public class ThreadDemo
{
public static void main(String[] args)
{
new Thread(new Runnable()
{
@Override
public void run()
{
while(true)
{
System.out.println("Runnable:"+Thread.currentThread().getName());
}
}
})
{
}.start();
}
}
结果如下:
Runnable:Thread-0
Runnable:Thread-0
Runnable:Thread-0
Runnable:Thread-0
Runnable:Thread-0
...
总结:第一段、第二段代码中,线程new的是Thread类的子类,子类覆盖了父类的run()方法,那么程序会执行该子类中的run()方法,并不会执行传入该子类参数中的Runnable对象中的run()方法。若是没有覆盖,会去找父类(即Thread类)中的run方法,查看源码Thread类中run()方法如下,
@Override
public void run() {
if (target != null) {
target.run();
}
}
target是Runnable对象,如果target不为空,那么就会执行Runnable中的run方法。第三段代码中传入了Runnable对象,所以程序会执行该Runnable对象的run方法,程序中new Runnable()中的run()方法实现了Runnable接口中的run()方法,最终是Runnable对象执行自己的run()方法,所以执行结果为:Runnable:Thread-0…