target.run();
target 就是 传进来的Runnable
当我们使用Thread的时候,想要启动线程,都会调用start()方法,而不是直接调用run()方法。那么为何不直接调用run()方法呢?下面先看下Thread的run()方法和start()方法的源码:
@Override
public void run() {
if (target != null) {
target.run();
}
}
public synchronized void start() {
//这里private volatile int threadStatus = 0;初始化的时候就是0,如果不为0的话就抛异常
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()方法,会启动新的线程,并且会让一个线程进入就绪状态,在调度系统分配时间片后,start()会进行相应的准备工作,然后执行run()方法内的内容。而如果直接调用run()方法,只是在主线程运行run()方法,无法起到多线程的效果。