1、start()和run()方法的比较
/**
* 描述: 对比start和run两种启动线程的方式
*/
public class StartAndRunMethod {
public static void main(String[] args) {
Runnable runnable = () -> {
System.out.println(Thread.currentThread().getName());//输出执行该语句的线程名
};
runnable.run(); //main
new Thread(runnable).start(); //Thread-0
}
}
2、start()方法
①含义:启动新线程
调用start()方法,将通知JVM在有空余时间时候创建新线程,调用start()方法的顺序并不能决定执行线程的顺序。
不能重复调用start()方法,在每次启动旧的线程之前,都应该检查线程状态。
源码:1)启动新线程检查线程状态,加入线程组,调用start0()。
public synchronized void start() {
if (this.threadStatus != 0) {
throw new IllegalThreadStateException();
} else {
this.group.add(this);
boolean started = false;
try {
this.start0();
started = true;
} finally {
try {
if (!started) {
this.group.threadStartFailed(this);
}
} catch (Throwable var8) {
}
}
}
}
private native void start0();
3、run()方法
public void run() {
if (this.target != null) {
this.target.run();
}
}
像我们刚才runnable.run()。其实就是一个普通的方法run()方法。run()方法的执行线程是主线程。要启动线程,要调用start()来间接调用run()方法。
4、面试
一个线程两次调用start()方法会出现什么情况?为什么?
既然start()方法会调用run()方法,为什么我们选择调用start()方法,而不是直接调用run()方法呢?