Если вы всегда используете ExecutorService вместо запуска своего потока?

С JDK >= 1.5, если предпочтительный способ запуска потока всегда быть службой Executor или Executor, или есть ли еще причины предпочесть использовать Thread.start, если вам не нужен то, что предоставляет ExecutorService?

Для syncronized я привык думать, что использование новых функций блокировки было предпочтительным, пока я не был объяснено иначе. Поэтому мне интересно то же самое о Исполнителях. Являются ли они просто способом обработки более сложных случаев или они должны быть стандартным выбором?

Ответы

Ответ 1

Лично, начиная с Java 5, я полностью оставил Thread и ThreadGroup, поскольку они обеспечивают меньшую настройку и функциональность, чем ExecutorService.

При использовании ExecutorService, я знаю, что могу использовать Callable, я знаю, что могу (с небольшими накладными расходами) расписывать повторяющиеся задачи. Как следствие, я рассматриваю прямую инстанцировку Thread объектов устаревшего кода, как Vector и Hashtable.

Ответ 2

Java Concurrency на практике, по крайней мере, ясно говорится в разделе 6.2.:

Основная абстракция для выполнения задачи в библиотеках классов Java не Thread, а Executor. [...]

Использование Executor обычно является самым простым путем для реализации дизайна производителя-потребителя в вашем приложении.

Ответ 3

Написание правильного многопоточного кода очень сложно. Красота рамки Executor заключается в том, что она реализует большую часть тяжелой работы, с которой сталкиваются разработчики, и требует только того, чтобы вы реализовали Callable или Future и программы для API java.util.concurrent. IMHO приводит к гораздо более читаемому коду и предоставляет гораздо меньше возможностей для неправильного его реализации из-за сложности правильного управления потоками.