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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小洋人最happy 中级黑马   /  2012-12-10 09:28  /  1854 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class ThreadTest
{
public static void main(String[] args)
{
  new Thread(new Runnable()
  {
   public void run()
   {
    System.out.println("runable run");
   }
  })
  {
   public void run()
   {
    System.out.println("subThread run");
   }
  }.start();
}
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

正序浏览
这是传统线程的两种创建方式的合用。
即创建Thread的子类对象,并覆盖它的run()方法;
同时又实现Runnable接口,覆盖接口的run(),再创建它的对象作为Thread类的构造函数的参数进行传值。
查看Thread类的run()方法的源代码,可以看到其实这两种方法都是在调用Thread对象的run(),所以如果已经覆盖了它的run()方法,就会直接调用它的run(),-------因此运行的结果是   “subThread run”。假如没有覆盖的话,并为该Thread队形设置一个Runnbale对象,该run()会调用runnable对象的run()。所以就是这个顺序,先看自己有没有,有的就直接用自己的,没有再调用runnable()的。
回复 使用道具 举报
李培根 发表于 2012-12-10 10:16
记得这个好像是视频里面的一到面试题,多线程结合匿名内部类。

class ThreadTest{

不错,看了你的解释豁然开朗啊
回复 使用道具 举报
这是两个匿名内部类,第一个实现的是Runnable里的run方法,第二个是重写了Thread里面的run方法
回复 使用道具 举报
class ThreadTest
{
public static void main(String[] args)
{
        Test t = new Test() ;
        TestRunnable tr = new TestRunnable();
        Thread t1 = new Thread(tr) ;
        t.start() ;
    }
}
class Test extends Thread
{
        public void run()
   {
    System.out.println("subThread run");
   }
}

class TestRunnable  implements Runnable
{
        public void run()
   {
    System.out.println("runable run");
   }
}
你那个代码不还原成不是匿名内部类,就是这样子的。自己研究下吧
回复 使用道具 举报
记得这个好像是视频里面的一到面试题,多线程结合匿名内部类。

class ThreadTest{
public static void main(String[] args){
  new Thread(new Runnable(){//匿名内部类作为任务
   public void run(){
    System.out.println("runnable run");
   }
  }
){
   public void run(){//Thread的子类对象。
    System.out.println("subThread run");//子类覆写了父类的run方法,运行子类。
   }
  }.start();
}

}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
两个;匿名内部类不是,呵呵,第一个实现Runnable接口的内部类,创建线程,第二个是封装任务的匿名内部类,开启线程。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马