2017-05-04 71 views
-1

我们可以使用Implementing Runnable或扩展线程类来创建线程。任何人都可以告诉我性能明智哪个更快地实现Runnable或扩展Thread类以及为什么?另外我知道在实现Runnable时,我们可以实现更多的接口并扩展一个类。如果我们直接扩展一个Thread类,那么扩展一个类是我们失去的东西。但在这两种情况下是否有任何性能差异性能明智,实现Runnable或扩展Thread类的速度更快

+2

这不是性能问题。没有可衡量的差异。应该首选Runnable,因为你应该使用像Executor这样的新并发类,而不是Thread。这些都采用Runnables。这有一个很好的理由。 – duffymo

+1

我认为关于“性能”没有实际的区别(你的意思是什么?执行速度更快,内存消耗更好?)。 Class和Interface的主要原因之一是在Java中你不能有多重继承,所以根据你的设计,你的类可能已经扩展了另一个类,而你所需要的只是实现Runnable。 –

+0

我的意思是执行速度更快。我知道在实现Runnable时,我们可以实现更多的接口并扩展一个类。如果我们直接扩展一个Thread类,那么扩展一个类是我们失去的东西。但是在这两种情况下是否有任何性能差异 – user2821056

回答

0

表现方面两者没有区别。然而,使用“implements Runnable”更好,因为它给你更多的自由(扩展另一个类,...),同一个对象在多个线程之间共享(这也减少了使用的内存)。

+1

这只是故事的一点。延长线程风险更大 – Stultuske

+0

这个解释很薄。这不是关于“自由”,而是关于正确的建模。并且(实际上)永远不会将在线程内部运行的内容建模为线程。 “表现”是一种红鲱鱼,只有在正确性被理解之前才在这个层面上被问到。 –

0

这取决于(一如既往):

  • 如果你想运行它只有一次,Thread扩展没有缺点,除了它是不够灵活,更难测试(例如,在一个单元测试)。
  • 如果您想更频繁地运行它,Runnable会更灵活,因为您可以使用线程池将它传递给Executor。通过这样做,您可以获得更好的性能,因为每次执行的线程创建开销都将被删除。

如果实现Runnable你有不同的方式(在单元测试同步,使用执行,或者即使有Thread包装也无妨),以执行代码。而纯粹的线程扩展永远不会有更好的性能,它只能是平等的。仅通过允许多个接口或使用独立继承来实现Runnable总是更好的选择,这只是更好的设计。在此之后我绝不会延伸Thread

+0

问题是,如果您的类型是_is-a_'Thread',那么您在* Thread中运行的内容应该只扩展'Thread',而不是。不过,它是_is-a_'Runnable'。所以问题不是“哪个表现更好?”这是一个可怕的问题。一个很好的问题是,“哪个是正确的?”和“哪个会导致更少的错误?”正确的工程每次都会带来不确定的微观“优化”。做对,让“表演”自己照顾自己。 –

相关问题