黑马程序员技术交流社区

标题: 多线程面试题 [打印本页]

作者: thoris    时间: 2015-6-14 22:44
标题: 多线程面试题
  1. new Thread(new Runnable()
  2.                         {  
  3.                                 public void run()
  4.                                 {
  5.                                         System.out.println("runnable run");       
  6.                                 }
  7.                         })
  8.                         {
  9.                                 public void run()
  10.                                 {
  11.                                         System.out.println("subthread run");
  12.                                 }
  13.                         }.start();
复制代码


看第一眼的时候,我觉得这代码能运行么。。。结果真的能。。。
结果大家自己试试就知道。
作者: 武汉小菜鸟    时间: 2015-6-14 23:50
谁能解释一下这段代码
作者: mishisanyi    时间: 2015-6-15 00:01
这道题果然有趣,两个匿名内部类,我关心的是到底谁的方法被重写了,我觉得应该是打印下面那句话吧
作者: mishisanyi    时间: 2015-6-15 00:09
mishisanyi 发表于 2015-6-15 00:01
这道题果然有趣,两个匿名内部类,我关心的是到底谁的方法被重写了,我觉得应该是打印下面那句话吧 ...

果然没错,第二个run()方法复写了以一个run方法,你看看api,可以发现Thread类实际是
public class Thread extends Object implements Runnable
Thread.run() (这里不能这么写,不是static方法,但我为了看上去容易理解)
          如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

作者: 悦鹏    时间: 2015-6-15 00:47
是吧,你答对了吧
作者: guiqulaixi    时间: 2015-6-15 01:13
张老师的视频里解释了原因的 建议去看下
Thread类继承了Runnable接口,覆盖run()方法,其中内容是
  1. public void run()
  2.         {
  3.                 if(target != null)
  4.                 {
  5.                         target.run();
  6.                 }
  7.         }
复制代码


这里的target是一个Runnable引用
所以假如我们重写了Thread类里的run()方法   就以我们重写的Thread类里的run()方法为执行对象
作者: 王占军    时间: 2015-6-15 01:57
这道题有意思哦   
作者: 1958078929    时间: 2015-6-15 09:02
我是这样理解的,第一个run方法是接口Runnable的run方法,而第二个run是指Thread线程里面的run方法,到底执行哪个就由start启动的对象所决定。不知道这样理解对不,大家可以一起讨论一下
作者: Huan220_欢    时间: 2015-6-15 09:35
有趣........来试试
作者: YongBao_Summer    时间: 2015-6-15 10:14
想法很奇特~
作者: micro_hx    时间: 2015-6-15 11:59
本帖最后由 micro_hx 于 2015-6-15 12:02 编辑

第一个run方法是runnable里的方法,第二个run方法是Thread里自带的方法。。。。就想一个类中有自己的方法,接口中也存在同名的方法,该类再次重写了该方法后,那么调用的时候,肯定是调用类里面的方法啊。。。。二者不矛盾啊。。。
作者: thoris    时间: 2015-6-15 20:36
mishisanyi 发表于 2015-6-15 00:09
果然没错,第二个run()方法复写了以一个run方法,你看看api,可以发现Thread类实际是
public class Threa ...

解释得不错~
作者: thoris    时间: 2015-6-15 20:38
micro_hx 发表于 2015-6-15 11:59
第一个run方法是runnable里的方法,第二个run方法是Thread里自带的方法。。。。就想一个类中有自己的方法, ...

你这个解释也很对  总之就是Thread重写了
作者: Foundmoon    时间: 2015-6-15 21:26
两个匿名内部类,呵呵
作者: 惜爱上缘    时间: 2015-6-15 21:30
感觉是run()被复写了,结果是subthread run




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2