2012-03-07 67 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组件,顺便说一句。