Java thread.start()和executor.submit(线程)之间的差异

Java thread.start()和executor.submit(线程)之间的差异,java,multithreading,executorservice,Java,Multithreading,Executorservice,我面临一个关于线程的问题。我有一个实现runnable的类,我可以在该类上使用thread.start()方法。 我的问题是我还有一个类java.util.concurrent.ExecutorService,我可以在其中调用executor.submit(线程) 谁能告诉我thread.start()和executor.submit(thread)之间有什么区别吗 executor.submit方法采用可运行线程,而不是线程。executorServices的要点是,它们控制创建和共享线程,因

我面临一个关于线程的问题。我有一个实现runnable的类,我可以在该类上使用thread.start()方法。 我的问题是我还有一个类
java.util.concurrent.ExecutorService
,我可以在其中调用executor.submit(线程)


谁能告诉我
thread.start()
executor.submit(thread)
之间有什么区别吗

executor.submit方法采用可运行线程,而不是线程。executorServices的要点是,它们控制创建和共享线程,因此调用它们的代码不必这样做。

您不应该向执行者提交线程。首先,它只是一种浪费,因为对它调用的唯一方法是
run()
,您只需要
Runnable
,而不需要
线程

其次,虽然这个问题在最新的JDK中得到了解决,但如果您创建了大量
线程
对象,并且没有对它们调用
.start()
,则通常会出现内存泄漏问题。基本上,创建
线程
对象会分配一些只能在调用
.start()
后才能回收的内存。因此,在早期的JDK中执行
executor.submit(thread)
是有潜在危险的(我认为它只在JDK6中得到解决)

回到您的问题,执行者。提交(线程)无效。。这完全是错误的,因为执行器使用自己的线程来执行runnable。这就是使用遗嘱执行人的全部意义所在。您希望将任务(调用)和执行分开。只有当您想提供执行器(线程)时,才应该使用
线程
,但很少需要这样做。通常,建议实现一个
Runnable
并使用执行器执行它,而不是自己处理
线程