楼主这个问题提得有深度,上面的同学们回答的都不错,但是,我查看了一下源代码和帮助文档,发现事情好像没那么简单
我们来看看文档中对 start方法 的描述:使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
注意,这里说是java虚拟机调用该线程的 run 方法,并不是start方法去调用 run 方法,上面的同学们都说错了!!!
那这个 start 方法到底干了什么呢?我们来看看源代码:
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0 || this != me) //start方法没有调用过 run方法
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
private native void start0(); //注意这个很奇怪的 start0 方法,他竟然是 native 修饰的
/**
* If this thread was constructed using a separate
* <code>Runnable</code> run object, then that
* <code>Runnable</code> object's <code>run</code> method is called;
* otherwise, this method does nothing and returns.
* <p>
* Subclasses of <code>Thread</code> should override this method.
*
* @see #start()
* @see #stop()
* @see #Thread(ThreadGroup, Runnable, String)
*/
public void run() { run方法
if (target != null) {
target.run();
}
}
根据以上代码我们不难发现,start 方法根本没去调用 run 方法,倒是调用了一个 native 修饰的 start0 方法,那么这个native到底是什么意思呢
我上网查了一下,当java调用本地代码(如 C,C++)的时候,需要使用native修饰
我们知道,windows操作系统是C,C++编写的,也就是说 start0 方法去调用windows代码了
我也不是太懂,但是我做了一个大胆的推测
当我们调用start方法时,java虚拟机会去调用windows的本地代码启动一个线程,然后java虚拟机再在此线程上运行 run 方法中的代码!!!
当然了,这只是我的推测,具体怎样,还望高人解答
|