问十:源码层面解析Thread中run()和start()的区别?

分析start()的源码:

调用start0()方法

    问十:源码层面解析Thread中run()和start()的区别?

是一个native方法

问十:源码层面解析Thread中run()和start()的区别?

进入http://hg.openjdk.java.net/jdk8u源码页查看其native方法的源码

问十:源码层面解析Thread中run()和start()的区别?问十:源码层面解析Thread中run()和start()的区别?

进入share目录,找到Thread.c

问十:源码层面解析Thread中run()和start()的区别?

发现其调用了JVM_StartThread方法

问十:源码层面解析Thread中run()和start()的区别?

通过查看其顶部引用,定位jvm.h

问十:源码层面解析Thread中run()和start()的区别?

进入jvm.h进行查看

问十:源码层面解析Thread中run()和start()的区别?

问十:源码层面解析Thread中run()和start()的区别?

在JVM_StartThread中,新建了一个JavaThread,这个方法还调用了thread_entry方法

问十:源码层面解析Thread中run()和start()的区别?

找到thread_entry方法

问十:源码层面解析Thread中run()和start()的区别?

发现在这个方法中,执行了线程中的run()方法

 

问十:源码层面解析Thread中run()和start()的区别?

总结之后就是:在调用start方法时,会调用JVM的JVM_StartThread,去创建一个新的子线程,再通过thread_entry方法去调用run()方法

 

回答:

调用start()方法会创建一个新的子线程并且启动

run()方法只是THread的一个普通方法的调用