我遇到有关线程的问题。我有一个实现runnable的类,我可以在该类上使用thread.start()方法。
我的问题是我还有一个类java.util.concurrent.ExecutorService
,我可以在其中调用executor.submit(thread)..
任何人都可以告诉我thread.start()
和executor.submit(thread)
...
答案 0 :(得分:4)
executor.submit方法采用Runnable而不是Thread。 executorServices的重点是它们可以控制创建和汇集线程,因此调用它们的代码不需要。
答案 1 :(得分:1)
您不应该向执行者提交线程。首先,它只是一种浪费,因为唯一会被调用的方法是run()
,您只需要一个Runnable
而不需要Thread
。
辅助,虽然在最新的JDK中解决了这个问题,但是如果你创建了很多Thread
个对象并且没有调用.start()
,则会发生内存泄漏问题。他们。基本上创建Thread
个对象会分配一些只能在调用.start()
后才能回收的内存。因此,在早期的JDK中执行executor.submit(thread)
是有潜在危险的(我认为它只在JDK6左右解决)。
回到你的问题,executor.submit(thread)无效..这是完全错误的,因为执行程序使用自己的线程来执行runnable。这毕竟是使用执行器的全部要点。您想要分离任务(调用)和执行。只有当您想要提供执行程序(线程)时,您应该使用Thread
,但您很少需要这样做。通常建议实现Runnable
并使用执行程序来执行它,而不是自己处理Thread
。