何时通过扩展创建线程

时间:2018-08-20 03:40:36

标签: java multithreading concurrency

通常可以通过两种方式创建线程

  1. 扩展线程类
  2. 实现Runnable接口

通过阅读所有教程,所有人都说实现Runnable接口总是好的,因为如果您通过extend(1st方法)创建,则无法扩展任何其他类。 同样,如果我们通过扩展来创建线程,那么每个线程都将创建新对象,而如果我们通过实现所有线程来创建线程,则将共享同一对象。

我的问题是实现Runnable是最好的选择,而扩展线程是一种不好的做法,为什么Java有此选项?我相信,如果通过扩展创建线程肯定会有一定的优势(我相信,当没有其他父类不是唯一的答案时,我们应该使用扩展线程方法)

预先感谢

3 个答案:

答案 0 :(得分:4)

2018年,真正的答案是:根本不用裸金属线。

如今,我们有类似fork/joinfuturesExecutorService框架的抽象。

避免自己做线程!

如果这样做,您会认为“好旧”的继承性偏重。在这种情况下,可以归结为:不扩展线程,而是实现Runnable。当您可以改用extends时,您不想通过使用implements来限制班级!

答案 1 :(得分:2)

这是一个设计决策,是何时应实现Runnable接口或何时应扩展线程。

  1. 您自己要问一些问题-如果您想要的对象是对象的特定版本或专用版本。如果它向现有Thread对象添加了新功能,则应该扩展threda类。否则,将用于实现Runnable接口。
  2. 实现Runnable不会创建线程。实施Runnable接口只会创建一个线程应执行的任务。
  3. 实现任务的另一个好处是任务是可重用的,而使用线程扩展创建的对象是不可重用的。

答案 2 :(得分:0)

要更正,可以通过3种方式创建线程

3.使用Callable界面

Java不允许一个类扩展多个类,以防止C / C ++中存在钻石问题。如果您确定自己的班级除了Thread以外不会扩展其他任何班级,您可以从Thread类高兴地扩展,或者建议扩展RunnableCallable接口

  

我相信,如果我们通过扩展来创建线程,肯定会有一定的优势

如果要为方法提供自定义实现,则可以获得扩展类的所有优点。