【问题标题】:difference between thread.start() and executor.submit(thread)thread.start() 和 executor.submit(thread) 的区别
【发布时间】:2010-06-07 13:20:49
【问题描述】:
我遇到了关于线程的问题。我有一个实现可运行的类,我可以在该类上使用 thread.start() 方法。
我的问题是我还有一门课 java.util.concurrent.ExecutorService 我可以在其中调用 executor.submit(thread)..
谁能告诉我thread.start()和executor.submit(thread)有什么区别...
【问题讨论】:
标签:
java
multithreading
executorservice
【解决方案1】:
executor.submit 方法采用 Runnable,而不是 Thread。 executorServices 的重点是它们可以控制线程的创建和池化,因此调用它们的代码不必这样做。
【解决方案2】:
您不应将线程提交给执行程序。首先,它只是一种浪费,因为唯一会调用它的方法是run(),而您只需要Runnable 而不需要Thread。
其次,虽然这个问题在最新的 JDK 中得到了解决,但是如果你创建了很多 Thread 对象并且没有在它们上调用 .start() ,就会出现内存泄漏问题。基本上,创建Thread 对象会分配一些内存,这些内存只能在调用.start() 后才能回收。因此,在早期的 JDK 中做 executor.submit(thread) 是有潜在危险的(我认为它只在 JDK6 左右解决了)。
回到您的问题, executor.submit(thread) 无效。这完全是错误的,因为 executor 使用自己的线程来执行 runnable。这就是使用 executor 的全部意义所在。您想将任务(调用)和执行分开。只有当你想提供执行器(线程)时,你才应该使用Thread,但你很少需要这样做。通常建议实现一个Runnable 并使用执行器来执行它,而不是自己处理Thread。