面试题-线程

今天公司新来的小伙伴问了我这样一个面试题:

他不清楚为什么最后输出的是thread中的方法,而不是runnable中的方法,然后我看了下他从网上搜出的别人写的答案,很多东西对于懂的人来说很容易就能看懂,但是对于刚刚踏入这一行业的人来说,他不明白。所以希望很多在这块迷茫的小伙伴能够更好的掌握这一点,那么我来说一下啊。如有不对的地方,欢迎指正!谢谢!

1,首先我们这样去分析,

相信大家对于这样的答案都毫无疑问吧,如果有疑问的话,建议哥们再去看看线程方面的基础知识吧!

现在带大家看下实现的原理:

     1.1,根据源码,我们可以看到:

           

    1.2  调用了init方法,其中的target就是我们通过thread构造函数传递过来的runnable接口的实现类(包括匿名实现)

      

1.3最终走到这个方法体中,多余的不看,这个方法中有一个                           

将我们传递过来的实现类对象赋值给了Thread中的变量

1.4 赋值完成后,开始运行start方法,最终执行Thread中的run方法:

                 

判断target是否为空,为空则不执行run方法,不为空则执行实现类中的run方法,即我上面所写的

              

到这一步,相信不懂的小伙伴应该也有个大致的了解了吧.

2 ,对于实现了接口runnable的方式大家应该有些了解了,那我们现在看下实现类的

2.1 这一步相当于重写了Thread中的run方法,从而去执行重写后的run方法,结果为:上图所示

3,两个结合起来:

由于在new Thread后重写了Thread中的run方法(相当于一个类继承了Thread,并重写了Thread的run方法),所以在执行Thread中的start方法时,就不会再走父类的Thread中的方法,而是会走重写后的run方法,所以这题的输出结果为:我是thread中的方法

4,那么问题又来了,如果我想先走接口中的方法,再走自己的方法怎么办???

4.1 那也很简单,这时候只需要调用父类中的run方法即可;

那么现在,不懂得小伙伴们,了解了吗???

猜你喜欢

转载自blog.csdn.net/java_lais/article/details/81152882
今日推荐