Разница между thread.start () и executor.submit (поток) - PullRequest
2 голосов
/ 07 июня 2010

Я столкнулся с проблемой, касающейся потока. У меня есть класс, который реализует runnable, и я могу использовать метод thread.start () для этого класса. У меня вопрос, у меня есть еще один класс java.util.concurrent.ExecutorService, в котором я могу вызвать executor.submit (поток) ..

Может кто-нибудь сказать, пожалуйста, в чем разница между thread.start() и executor.submit(thread) ...

Ответы [ 2 ]

4 голосов
/ 07 июня 2010

Метод executor.submit принимает Runnable, а не Thread. Суть executorServices заключается в том, что они берут на себя управление созданием и пулированием потоков, поэтому код, вызывающий их, не обязан.

1 голос
/ 07 июня 2010

Вы не должны отправлять ветку исполнителю. Во-первых, это просто пустая трата времени, потому что единственный метод, который будет вызываться для него, это run(), а вам просто нужно Runnable и не нужно Thread для этого.

Вторичный, хотя эта проблема решается в последней версии JDK, раньше возникала проблема утечки памяти, если вы создаете много объектов Thread и не вызываете .start() для них. По существу, создание Thread объектов выделяет некоторую память, которую можно восстановить только после вызова .start(). Поэтому выполнение executor.submit(thread) потенциально опасно в более ранних JDK (я думаю, что это было решено только в JDK6 или около того).

Возвращаясь к вашему вопросу, executor.submit (thread) недопустим. Это просто неправильно, потому что исполнитель использует свой собственный поток для выполнения runnable. В этом и заключается весь смысл использования исполнителя. Вы хотите разделить задачу (вызов) и выполнение. Только если вы хотите указать исполнителя (нить), вы должны использовать Thread, но это редко требуется. Обычно рекомендуется реализовать Runnable и использовать исполнителей для его выполнения, а не иметь дело с Thread самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...