A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 石贤芝 于 2013-5-13 23:46 编辑
  1. class ThreadTest
  2. {
  3.         public static void main(String[] args)
  4.         {

  5.                 new Thread(new Runnable()
  6.                 {
  7.                         public void run()
  8.                         {
  9.                                 System.out.println("runnable run");
  10.                         }
  11.                 })
  12.                 {
  13.                         public void run()
  14.                         {
  15.                                 System.out.println("subThread run");
  16.                         }
  17.                 }.start();
  18. }
  19. }
复制代码
上面代码的输出结果是  subThread run  

而下面代码
  1. class ThreadTest
  2. {
  3.         public static void main(String[] args)
  4.         {

  5.                 new Thread(new Runnable()
  6.                 {
  7.                         public void run()
  8.                         {
  9.                                 System.out.println("runnable run");
  10.                         }
  11.                 })
  12.                 {               
  13. }.start();
  14. }
  15. }
复制代码
的输出结果是: runnable run

视频中听得还是不大明白,烦请各位详细说明一下,谢谢

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

9 个回复

倒序浏览
这么给你说,因为匿名的Thread子类中已经定义run方法(打印   subThread run ),就把父类Thread中的run方法覆盖了(而父类的run方法的具体定义你查原码吧,简单理解就是说,当Runnable!=null时执行其run方法,否则执行Thread类中的run方法,Runnable其实是Thread的宿主对象)
参考 http://bbs.itheima.com/thread-48762-1-3.html
回复 使用道具 举报
这是JDK源码,更能说明问题
  1. public
  2. interface Runnable {
  3.     public abstract void run();
  4. }//这是Runnable源码
  5. public class Thread implements Runnable {
  6. private Runnable target;
  7. public void run() {
  8.         if (target != null) {
  9.             target.run();
  10.         }
  11.     }
  12. }//这是Thread里关于Runnable的源码
复制代码
所以,由此可见,就不难理解了

回复 使用道具 举报

如果帖子没有问题了  那么把帖子的类型改为 “已解决”,  如果不会改   点自己的帖子下面有个编辑,然后改帖子的类型就好了
上个帖子你还没修改,小心扣技术分了
回复 使用道具 举报
曹睿翔 发表于 2013-5-13 21:30
这么给你说,因为匿名的Thread子类中已经定义run方法(打印   subThread run ),就把父类Thread中的run方 ...

嗯,正解。
第一个代码可以说:有个内部类继承了Tread类,还有另外一个内部类实现了Runnable接口,关于继承的那个类如果覆盖了run() 方法,运行时就依照这个执行。如果没有覆盖run() 方法,运行时就依照实现接口的那个内部类的run() 方法执行。
回复 使用道具 举报
曹睿翔 发表于 2013-5-13 21:30
这么给你说,因为匿名的Thread子类中已经定义run方法(打印   subThread run ),就把父类Thread中的run方 ...

学习了 。          发现自己遗漏好多,浮躁,我得去脑补下了{:2_33:}
回复 使用道具 举报
落后好多
回复 使用道具 举报
石头135 发表于 2013-5-14 12:42
落后好多

加油,石头。。。认真学  
回复 使用道具 举报
石贤芝 发表于 2013-5-14 16:49
加油,石头。。。认真学

恩,谢谢!
回复 使用道具 举报
这么跟你说吧,后面这种方式new Thread(){}.start...
就类似于你是继承了Thread类,而不是实现了Runnable接口方式。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马