start方法里面有一个关键的方法,start0(),这是一个native方法。这个方法源码我们是看不到的,但是看文档得知,jvm是通过这个方法调用run方法的。
也就是这里其实最少有两步,第一步是使用了一个线程 第二步这个线程调用了run方法。
public synchronized void start() {
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
new Thread(t).run(); 如果是这样coding,直接用线程调用run方法,这个没有使用到创建的线程,因为没有经过start0();
本来想着是子类继承父类,这个执行的是thread类的run方法。但是仔细一看,
public void run() {
if (target != null) {
target.run();
}
}
父类执行的确实是父类的run,但是run里面确执行的是runnable接口的抽象方法run。这是多态,其实执行的还是实现类的run。因此new Thread直接调用run,执行的是资源类的run方法。只是并没有线程而已
那如果资源类直接调用run呢?
资源类继承thread又重新run方法,因此走的是子类的run,不走thread的run