2014-10-05 145 views
0

我已经写了下面的例子:为什么不运行方法调用?

public class MyThread extends Thread{ 
    MyThread(Runnable r){ 
     super(r); 
    } 
    public void run(){ 
     System.out.println("run"); 
    } 
} 
public static void main(String[] args) 
{ 
    Thread t = new MyThread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("rrrrrrrrrruuuuuuuuuuuun"); 
     } 
    }); 
    t.start(); //run 
} 

为什么在MyThread定义运行methdo叫呢?

+0

@ practice2perfect我已经写了叫MyThread的,只是导入他到主一个单独的类。 – 2014-10-05 14:15:14

+0

为什么不是你的主要方法封装到一个类? – 2014-10-05 14:18:49

+2

@Fev它只是一个Main类的一个片段和一个分离的MyThread类。 – 2014-10-05 14:19:25

回答

3

因为有一个Runnable构建一个线程的默认行为是委托给可运行作为参数传递给构造函数。但是你在线程本身中覆盖了run(),所以不是委托给runnable,而是执行覆盖的run()方法中的代码。

为了记录在案,这里的Thread.run()的默认实现,你推翻:

private Runnable target; 

public void run() { 
    if (target != null) { 
     target.run(); 
    } 
} 
+0

嗯,这是解释一切。谢谢。 – 2014-10-05 14:18:09

3

因为你的MyThread.run没有覆盖,但是Runnable.run是。现在,如果您查看MyThread.run的实施,则存储的Runnable不参与其中。换句话说,它与构造函数的可运行性无关。您应该使用:

public static void main(String[] args) 
{ 
    Thread t = new MyThread() { 
     @Override 
     public void run() { 
      System.out.println("rrrrrrrrrruuuuuuuuuuuun"); 
     } 
    }); 
    t.start(); //run 
} 

由于@BorisTheSpider笔记,来推翻Thread一般不是好的做法:一Thread有责任开始Thread并把控制权交给运行的。更好的实现是:

public static void main(String[] args) 
{ 
    Thread t = new Thread(new MyThread() { 
     @Override 
     public void run() { 
      System.out.println("rrrrrrrrrruuuuuuuuuuuun"); 
     } 
    })); 
    t.start(); //run 
} 
+0

向'Thread'提供'Runnable'而不是扩展'Thread'是更好的做法。这更加干净地分离了关注点,并避免了由于锁定线程实例监视器而导致的大量同步错误。 – 2014-10-05 14:21:14

+0

@BoristheSpider:我同意,但这不是我想的问题。问题是为什么继承原则不起作用。但是你的评论是有建设性的,因为它表明了“良好的做法”。我会将其添加到答案中。 – 2014-10-05 14:24:02

+2

@BoristheSpider:更新,更好? – 2014-10-05 14:25:35

相关问题