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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gudao20080 中级黑马   /  2013-8-26 11:21  /  1576 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 gudao20080 于 2013-8-26 13:26 编辑
  1. public class TraditionalThreadTest {

  2. public static void main(String[] args) {

  3. Runnable r = new Runnable(){
  4. public void run(){
  5. System.out.println("wowo");
  6. }

  7. };
  8. Thread th2 = new Thread(r){
  9. public void run(){
  10. System.out.println("hehe");
  11. }
  12. };
  13. th2.start(); //这里为什么输出是hehe而不是wowo呢
  14. }

  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 淡定

查看全部评分

11 个回复

正序浏览
自己有,就不到别处找,所以他本身有,这应该是继承吧!
回复 使用道具 举报
Thread th2 = new Thread(r){ //这里已经新建了Thread的匿名子类,th2指向这个子类对象
public void run(){

System.out.println("hehe");

}

};

th2.start();//在这里开启的Thread子类的线程
//这里为什么输出是hehe而不是wowo呢

}

回复 使用道具 举报
杨伟斌 发表于 2013-8-26 12:59
runnable是不是得用类继承啊?

runnable他是一个接口,是用来实现的。
回复 使用道具 举报
  1. public class TraditionalThreadTest {
  2.         public static void main(String[] args) {       
  3.                 Runnable r = new Runnable(){
  4.                         public void run(){
  5.                                 System.out.println("wowo");
  6.                         }               
  7.                 };
  8.                 Thread th2 = new Thread(r)
  9. //                {
  10. //                public void run(){
  11. //                        System.out.println("hehe");
  12. //                }
  13. //                }
  14.                 ;
  15.                 th2.start(); //这里为什么输出是hehe而不是wowo呢
  16.         }

  17. }
复制代码
如果代码写成这样的话运行的结果就是“wowo”了。
你的问题出现在:Thread th2 = new Thread(r)这句出入的r是run方法被调用的对象。
而你呢又给线程对象th2定义了自己的run方法。毕老师说过自己有调用自己的。所以在th2.start();时他就调用了自己的run方法--public void run(){
System.out.println("hehe");所以它输出的结果就是“hehe”了
回复 使用道具 举报
gulup 发表于 2013-8-26 13:19
再者,你这样的写法其实是矛盾的,既然你已经创建了一个Runnable类的子类对象,那么应该直接新建一个Thread类 ...

谢谢你的耐心回答,我明白了{:soso_e100:}
回复 使用道具 举报
gulup 来自手机 中级黑马 2013-8-26 13:19:14
7#
再者,你这样的写法其实是矛盾的,既然你已经创建了一个Runnable类的子类对象,那么应该直接新建一个Thread类的对象并把Runnable类的子类对象传入即可。但是你却又新建了一个继承了Thread的子类,既然你新建了一个继承了Thread类的子类,那么就不应该把Runnable子类对象当做参数传入来新建线程了。多线程操作,Runnable和Thread应该二选其一。一般应该使用Runnable
回复 使用道具 举报
杨伟斌 发表于 2013-8-26 12:59
runnable是不是得用类继承啊?

应该不用继承了吧,这样写也就相当于是接口Runnable的一个实例对象

  1. <DIV class=blockcode>
  2. <BLOCKQUOTE>Runnable r = new Runnable(){
  3. public void run(){
  4. System.out.println("wowo");
  5. }
  6. };
复制代码
回复 使用道具 举报
首先你实现了了一个Runnable类的对象,把它作为参数传递给Thread类,创建一个线程,你在调用thread构造方法带参数r的时候如果直接分号结束的时候实现thread的类并把r的run方法复写掉thread的run方法,但是你不分号而是加大括号,里面的run方法又把已经复写了的run方法给复写掉了,等于是你实现了Runnable但是你却没有去用它,而是自己复写了run方法
回复 使用道具 举报
gulup 来自手机 中级黑马 2013-8-26 13:14:06
板凳
你这个代码写得有够简介的。。。不过简洁过头了,就不利于阅读了。你这个问题其实很好回答。你的th2的这个写法,相当于你直接新建了一个继承了Thread类的子类的实例化对象,并指向了th2。你也在构造方法中传入了一个Runnable类的子类实例化对象了,观察Thread类的源码可以发现,Thread类的run方法是直接调用传入的Runnable类的实例化对象的run方法的。但是,你的代码中,这个th2指向的Thread类的实例化对象却覆盖了run方法,根据多态的特点,调用的其实是被覆盖的子类方法。那就是说,并没有调用到你传入的Runnable类对象的run方法。所以才会输出你现在看到的结果。
回复 使用道具 举报
runnable是不是得用类继承啊?
回复 使用道具 举报
你的这个问题有些怪哦,  我看不懂你这个代码是怎么写的,没有见到线程类,而且  对于你的问题而言  ,你的那个Runnable里面的方法  若要让它运行  也必须得有   对象。start()方法调用才能运行啊,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马