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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hello world 黑马帝   /  2012-8-8 19:20  /  2480 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class ThreadTest {
public static void main(String[] args) {
  
  new Thread(new Runnable() {
   public void run() {
    System.out.println("Runnable");
   }
  }) {
   public void run() {
    System.out.println("Thread");
   }
  }.start();
}
}
这个线程会调用哪个run()那?有点晕晕的啊。

8 个回复

倒序浏览
应该是会调用Thread吧,还可以这么写呢啊?
你的程序里应该是用实现Runnable() 接口,复写里面的run方法,然后又复写一遍run方法,所以应该调用的是第二个run方法了

我试跑了一下,确实输出的是"Thread"
回复 使用道具 举报
杨锦 发表于 2012-8-8 19:44
应该是会调用Thread吧,还可以这么写呢啊?
你的程序里应该是用实现Runnable() 接口,复写里面的run方法,然后 ...

哈,是啊 ,有意思不,我也纳闷,这程序还能这么写,有点想不通啊。
回复 使用道具 举报
刘向阳 发表于 2012-8-8 19:46
哈,是啊 ,有意思不,我也纳闷,这程序还能这么写,有点想不通啊。

其实就是覆盖了两次run方法应该,你再在后面复写一次应该还行,乍一看吓我一跳,我以为两种创建线程的方式可以组合起来写!!
回复 使用道具 举报
public class ThreadTest {
public static void main(String[] args) {
   
   new Thread(new Runnable() {
    public void run() {
     System.out.println("Runnable");
    }
   }
//你在小括号里写这些干什么?)
{
    public void run() {
     System.out.println("Thread");
//这个才是在定义内部类啊! }
   }.start();
}
}

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 小括号里面是匿名内部类

查看全部评分

回复 使用道具 举报
本帖最后由 杨文宇 于 2012-8-8 20:09 编辑

这个代码相当于
new Thread(){}这是创建了一个匿名类对象,这个匿名类继承了Thread,因为没有名字,要重写里面的方法就只能在花括号里面写,就变成
new Thread(){ public viod run(){}}
new Thread(){public void run(){}}.start();就相当于Thread的子类来开启线程,只是这个子类没有名字而已。
new Thread(.....){}   小括号放的也是匿名类,只是意义不大。因为它new出来的是Thread的子类,覆盖了run方法


评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

回复 使用道具 举报
查询API:
void start()
          使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
分为两步:
(1)启动线程
(2)再用该线程的run().
楼主代码new Thread(){run()}.start().
先启动匿名内部类构造的线程,
再调用该线程的run(),肯定是打印Thread
回复 使用道具 举报
黑马张涛 发表于 2012-8-8 20:05
public class ThreadTest {
public static void main(String[] args) {
   

哈,宝贝  你看这样写是不没问题啊  还能运行 是不是很有意思
回复 使用道具 举报
不好意思,括号那么多,看错了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马