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