面试题:Thread的start和run的区别
前言
这道题是并发编程关于线程Thread基础的面试题,小伙伴们是不是感觉简单?还是自己一下子蒙了呢?老顾今天来分享一下
先上代码
t.run(); //调用run方法
//调用执行
current main thread is main
task run.....
task thread is : main
换成调用方法t.start(),执行
current main thread is main
task run.....
task thread is : Thread-0
小伙伴们是否已经知道他们的区别了
1、run方法就是个普通的方法,被main线程调用,所以在执行task()方法时,是main线程调用的。
2、start方法被main线程调用,但执行task()方法并不是main线程。
源码分析
知道了run和start的区别,我们来看看start方法源码
start方法中调用了本地方法start0,native即是本地方法(也是底层方法)。怎么看start0方法,可以去访问openjdk源码(访问比较慢)。
start0映射的方法就是JVM_StartThread,我们再看一下jvm.cpp文件中JVM_StartThread方法,里面有段代码
在看下thread_entry方法
就是在thread_entry方法中调用run方法
总结
start方法中的基本流程
小伙伴们看到这里,是不是感觉这个面试题很简单呢?如果我们能够回答面试官达到源码级别,再弄个流程图,应该会加分吧。不要小看很简单的问题,也许里面有大学问。