- public class ThreadTest {
- // 定义一个方法
- private static void testdemo(){
- // 输出这个方法的线程名字
- System.out.println("这里是 testdemo 方法 :" +Thread.currentThread().getName());
- }
- public static void main(String[] args) {
- Thread t = new Thread(){
- public void run(){
- testdemo();
- }
- };
- System.out.println("这里是 main 方法 :" + Thread.currentThread().getName());
- t.run();
- // t.start();
- }
- }
调用 run 方法出现的结果
调用 start 方法出现的结果
接下来我们来看下调用 start 这个方法为什么会不一样
点击进入 start 这个方法
jdk 网站: http://hg.openjdk.java.net
进入到具体的目录: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/b860bcc84d51/src/share/native/java/lang
这里看的是 jdk8 的
进入 Thread.c 这个文件
来到 JVM 文件: http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/8c0fa90986a6/src/share/vm/prims/jvm.cpp
搜索 JVM_StartThread
然后再去深入看下 thread_entry 这里做了什么
1, 调用 start 方法的时候是会去创建一个新的子线程, 但是最后还是调用了 run 方法; 即调用 start()--->start0()-->JVM_StartThread-->thread_entry-->run()
2, 调用 run 方法的时候还在主线程调用, 即 t.run();-->Thread 这个类中的重写的 run 方法
start 方法最后还是调用了 run 方法, 所以两者除了执行步骤不一样, 其他都差不多
来源: http://www.bubuko.com/infodetail-3364780.html