2014-10-05 146 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

相關問題