Есть ли штраф за использование
ExecutorService e=Executors.newSingleThreadExecutor();
e.execute(callable)
e.shutdown()
по сравнению с:
new Thread(runnable).start()
Да, есть "штраф"": ExecutorService
, скорее всего, будет более дорогим в создании, поскольку он также создает очередь для задач, которые вы отправляете, и если поток завершает свою работу до завершения работы, то сбойный поток будет заменен другим для выполнениялюбые последующие задачи (так что там довольно много логики).Однако вы, вероятно, не хотите создавать ExecutiveService
каждый раз, когда хотите запустить задачу ... это, вероятно, не лучшее использование ExecutorService
(подробнее об этом в следующем вопросе).
Если Callable не длинный, и никогда не будет запущено более одного экземпляра, можно использовать код из -1-?Или лучше использовать ExecutorService в качестве статического и повторно использовать между вызовами?
Рекомендуемое использование ExecutorService
в качестве пула потоков, где вы сохраняете ExecutorService
и продолжаете отправлять задачидо тех пор, пока у вас есть задачи для отправки.Это может быть статический элемент или просто обычный член, который не имеет значения и сильно зависит от ваших требований / дизайна.Даже если вы запускаете только один экземпляр за раз (т.е. у вас есть только однопоточный исполнитель), все же более эффективно использовать ExecutorService
, потому что он повторно использует поток, поэтому в долгосрочной перспективе он будет дешевлечем создание нового потока для каждой отправляемой вами задачи.
Если у меня есть несколько задач ... есть ли проблемы для каждой задачи, чтобы иметь службу исполнителя или лучше иметь централизованную?
Нет проблем, но это неэффективно, поэтому просто имейте централизованную службу исполнителя.
Какие ресурсы потребляет Исполнитель, если он не выключен ()?
Не думаю, что вам следует особенно беспокоиться об этом, особенно если вы используете Executor
в правильном контексте, он будет минимальным.