通过扩展 Thread 类或实现 Runnable 来创建线程更可取的是啥? [复制]

Posted

技术标签:

【中文标题】通过扩展 Thread 类或实现 Runnable 来创建线程更可取的是啥? [复制]【英文标题】:What is more advisable to create a thread by extending a Thread class or implementing Runnable? [duplicate]通过扩展 Thread 类或实现 Runnable 来创建线程更可取的是什么? [复制] 【发布时间】:2011-01-22 22:18:10 【问题描述】:

我想知道通过扩展线程类或实现Runnable接口创建线程哪个更可取。为什么?

谢谢..

【问题讨论】:

【参考方案1】:

您应该将其设为Runnable,然后将其添加到任何现有的线程池类中。您将工作单元封装在新类中,然后使用线程来运行它。

如果你对线程类本身做一些事情,你只会扩展Thread,比如用新的功能扩展它。我怀疑是这样的。

另一种方法是创建一个由线程和自定义逻辑组成的新类,例如它有一个Thread 内部和它自己的'execute()' 方法,它调度线程并将(this) 添加为一个工作项,对外部完全隐藏......但在这种情况下,你将让你的课程@ 987654324@ 无论如何,只是提供一种方便的方法,使其更容易添加到线程中。

【讨论】:

【参考方案2】:

如果你扩展 Thread,你总是必须调用 .start(),它会启动一个 NEW 线程并执行任务。

如果你让它 Runnable,你也可以做 new Thread(runnable).start(),但你不限于此。您可以回收线程,从而节省一些资源,如下所示:

ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor();
service.execute(runnable);
service.execute(someOtherTask);

先把一堆你的runnables放在一个列表中,然后当你想执行它们时执行它们:

List<Runnable> todoList = new ArrayList<Runnable>();
Runnable fetchPaper = new Runnable("paper");
todoList.add(fetchPaper);
Runnable fetchMilk = new Runnable("milk");
todoList.add(fetchMilk);

//do something else or even return todoList...
ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor();
for(Runnable task : todoList)
    recycleSingleThread.execute(task);

或者你甚至可以这样做

runnable.run();

在你自己的线程中。

也许您甚至可以保存一个可运行文件,然后对其进行反序列化并运行它。 如果您扩展 Thread,所有这些灵活性都将不存在。

【讨论】:

【参考方案3】:

实例化 Runnable 可以更清晰地将代码与线程实现分开。 Runnable 接口只是声明您可以在不同的线程中运行此代码。

此外,由于您可以实现多个接口但只能扩展一个类,因此您只能在实现 Runnable 时提供自己的超类。如果扩展 Thread,则不能有任何其他超类。

对 Runnable 的唯一警告是您需要两个对象,一个 Thread 实例来实际运行代码,一个 Runnable 实现来提供代码。

【讨论】:

【参考方案4】:

可运行,因为您没有向 Thread 类添加专门的行为 - 您只是将您的逻辑标记为能够作为自己的线程运行。

【讨论】:

以上是关于通过扩展 Thread 类或实现 Runnable 来创建线程更可取的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java中继承thread类与实现Runnable接口的区别

实现 Runnable 与扩展 Thread [重复]

如何使用android延迟不扩展或实现Thread或Runnable

扩展线程比实现 Runnable 更可取的场景? [复制]

Thread使用总结——Runnable和Thread的区别是啥

Java语言是多线程的