Thread start()和run()的区别
1.抛出结论
start()方法是新起一个线程去执行run()方法中的代码。相当于除了主线程之外又有新的线程进入就绪状态。
run()方法只是一个正常的abstart抽象方法的重写。只有主线程,并没有新的线程被创建,需要按照原来主线程的执行顺序来执行run()中代码。
2.查看源码run()
public
class Thread implements Runnable{}
/* What will be run. */
private Runnable target;
/**......*/
@Override
public void run() {
if (target != null) {
target.run();
}
}
}
可以看到Thread类也只是实现了Runnable 接口
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
而我们的Runnable接口也只是一个可以进行函数式Lambda表达式的接口而已。说白了run()只是一个正常的方法。
3.查看源码start()
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
private native void start0();
可以看到start() 方法是调用了本地方法栈中的native方法start0() ,这里是创建了新的线程去调用run()方法。
如有错误欢迎指正