黑马程序员技术交流社区

标题: 匿名内部类线程run方法调用问题 [打印本页]

作者: hello world    时间: 2012-8-8 19:20
标题: 匿名内部类线程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();
}
}
这个线程会调用哪个run()那?有点晕晕的啊。

作者: 杨锦    时间: 2012-8-8 19:44
应该是会调用Thread吧,还可以这么写呢啊?
你的程序里应该是用实现Runnable() 接口,复写里面的run方法,然后又复写一遍run方法,所以应该调用的是第二个run方法了

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

哈,是啊 ,有意思不,我也纳闷,这程序还能这么写,有点想不通啊。
作者: 杨锦    时间: 2012-8-8 19:48
刘向阳 发表于 2012-8-8 19:46
哈,是啊 ,有意思不,我也纳闷,这程序还能这么写,有点想不通啊。

其实就是覆盖了两次run方法应该,你再在后面复写一次应该还行,乍一看吓我一跳,我以为两种创建线程的方式可以组合起来写!!
作者: 黑马张涛    时间: 2012-8-8 20:05
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();
}
}
作者: 杨文宇    时间: 2012-8-8 20:06
本帖最后由 杨文宇 于 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方法



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

哈,宝贝  你看这样写是不没问题啊  还能运行 是不是很有意思
作者: 黑马张涛    时间: 2012-8-8 22:32
不好意思,括号那么多,看错了!




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