Java thread.start()和executor.submit(线程)之间的差异
我面临一个关于线程的问题。我有一个实现runnable的类,我可以在该类上使用thread.start()方法。 我的问题是我还有一个类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的要点是,它们控制创建和共享线程,因
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
并使用执行器执行它,而不是自己处理线程