Если вы всегда используете 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 приводит к гораздо более читаемому коду и предоставляет гораздо меньше возможностей для неправильного его реализации из-за сложности правильного управления потоками.