通过扩展 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接口的区别
如何使用android延迟不扩展或实现Thread或Runnable