Java 通过扩展thread类或实现Runnable来创建线程更可取的做法是什么?

Java 通过扩展thread类或实现Runnable来创建线程更可取的做法是什么?,java,multithreading,Java,Multithreading,我想知道通过扩展thread类还是通过实现Runnable接口来创建线程更可取,为什么 谢谢..可运行,因为您没有向Thread类添加专门的行为-您只是将您的逻辑标记为可以作为自己的线程运行。您应该使其可运行,然后将其添加到任何现有的线程池类中。您将工作单元封装在新类中,然后使用线程运行它 如果您对Thread类本身做了一些事情,比如用新功能扩展它,那么您只会扩展Thread。我怀疑情况并非如此 另一种方法是创建一个由thread和您的自定义逻辑组成的新类,例如,它内部有一个thread,还有它

我想知道通过扩展thread类还是通过实现Runnable接口来创建线程更可取,为什么


谢谢..

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

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

如果您对Thread类本身做了一些事情,比如用新功能扩展它,那么您只会扩展
Thread
。我怀疑情况并非如此


另一种方法是创建一个由thread和您的自定义逻辑组成的新类,例如,它内部有一个
thread
,还有它自己的“execute()”方法,它在其中调度线程并将(此)添加为工作项,完全隐藏在外部。。。但在这种情况下,您将使类
始终处于可运行状态
,只是提供了一种方便的方法,使将其添加到线程中变得更容易。

实例化可运行状态可以在代码和线程实现之间实现更清晰的分离。Runnable接口只是声明您可以在不同的线程中运行此代码

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


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

如果扩展线程,则始终必须调用.start(),它启动新线程并执行任务

如果使其可运行,还可以执行新线程(Runnable).start(),但您并不局限于此。您可以循环使用线程,从而节省一些资源,如下所示:

ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor();
service.execute(runnable);
service.execute(someOtherTask);
首先将一组可运行项放入列表中,然后在您想执行它们时执行它们:

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();