2012-03-07 118 views
1

可能重複:
Java: 「implements Runnable」 vs. 「extends Thread」問題上實現Runnable

我對多線程編程的兩個問題。我在網上閱讀了一些答案,但仍然找不到令人滿意的答案。

  1. 實現Runnable優於擴展線程類。爲什麼?

  2. 它是怎樣才能擺脫重寫只是run()方法?

據赫伯特·希'的完整參考Java的,如果我們沒有覆蓋比其他運行Thread類()的任何方法,它的更好,我們實現Runnable接口。

我的第二個問題可能聽起來有點愚蠢,但我似乎錯過了一些東西,我不確定整個事情是如何工作的。

回答

5

1:實現Runnable優於擴展線程類。爲什麼?

因爲它可以讓你的類,如果要,而不是被迫延長Thread擴展另一個類。

2:它是如何逃脫只是run()方法?

您當然可以覆蓋其他方法,但Thread對象將在線程啓動時調用run()方法。這就是它的工作原理。默認Thread.run()方法是:

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

如果調用Thread構造與Runnable然後就是什麼target設置爲。如果您擴展Thread@Overriderun()方法,那麼這是在線程對象啓動時將被調用的方法。

這就是Thread類的工作原理。

2:它是如何逃脫只是run()方法?

您可以在這裏說錯並代替問爲什麼我們只需要實施Runnable()run()方法。

  • Runnable是一個run()方法,你必須實現一個接口。
  • Thread是一個具體的類,你是延伸。除非類爲final或方法爲final,否則可以覆蓋具體類中的任何方法。

請確保您使用正確的Java術語,並且不要混淆implementoverride

+0

@加里 - 但是我們可以只在我們重寫該類的所有方法時才能實現一個類?如在抽象類中。我不是嗎? – Vishnu 2012-03-07 16:26:03

+0

@vishnu你不能實現一個類。你只能擴展它。看到我的答案。 – adarshr 2012-03-07 16:26:46

+0

@vishnu:如果你正在實現一個接口,你需要重寫該接口中的所有方法,除非你的類是抽象的。如果你正在擴展一個抽象類,你需要實現所有的抽象方法,除非你的類本身是抽象的。如果你正在擴展一個非抽象類,那就沒有什麼可實現的。 – Jeremy 2012-03-07 16:28:13

0

在深入研究之前有三個基礎。

  • 一類只能有extend一類。
  • 一類可以implement任意數量的接口。
  • 一個接口可以extend任意數量的接口。

此外,abstract類是一個類。所以它就像一個班級,你不能implement它。你只有extend吧。

+0

我的不好。實現一個接口。 – Vishnu 2012-03-07 16:27:36

0

如果擴展了Thread,而實現Runnable時沒有得到,則可能會出現一些陷阱。

public static String getName() { 
    return "My Test Application"; 
} 

public static void stop() { 
    System.out.println("Shutting down"); 
} 

public static void main(String... args) { 
    new Thread() { 
     @Override 
     public void run() { 
      System.out.println(getName()); 
      stop(); 
     } 
    }.run(); 
    System.out.println("Bye now."); 
} 

打印

Thread-0 
Bye now. 

看看你能有多少錯誤發現。

0

不必要的繼承通常是一個壞主意。你可能會聽到「更喜歡構圖而不是繼承」。我相信谷歌可以爲你提供足夠的鏈接。一般的問題是繼承會在類之間帶來緊密的,不必要的耦合。

同樣適用於GUI組件,順便說一句。