thread.start()和executor.submit(thread)之间的区别

时间:2010-06-07 13:20:49

标签: java multithreading executorservice

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

任何人都可以告诉我thread.start()executor.submit(thread) ...

之间的区别

2 个答案:

答案 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