1、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 */
}
}
}
分析
1)线程执行过一次后,他的threadStatus一定会变为非0。对一个线程多次执行start()方法,会抛出IllegalThreadStateException异常。
if (threadStatus != 0)
throw new IllegalThreadStateException();
2)将当前线程加入他属于的那个线程组
group.add(this);
3)实际启动一个线程
start0();
点击 start0()进入如下代码,可知,这是一个native的方法。
private native void start0();
4)start0()成功启动后,下一步会去调用run()方法。如果创建线程是通过实现Runnalbe接口的方式,这里调用的就是那个Runnable对象的run()方法;如果是继承Thread类的方式,就会执行你重写的run()方法。这里的target表示Runnable。
@Override
public void run() {
if (target != null) {
target.run();
}
}
2、总结
1)一个线程启动后,threadStatus就是非0了,就不能再重新启动了,start方法不能再次调用。
2)线程启动后,会加入一个线程组中。
3)启动一个线程实际是走start0(),是native方法。