Исполнители используют и стоимость штрафа - PullRequest
5 голосов
/ 24 августа 2011

Несколько вопросов о наилучшем использовании Executors для работы с памятью и временем:

  1. Есть ли штраф за использование

    ExecutorService e = Executors.newSingleThreadExecutor();
    e.execute(callable)
    e.shutdown()
    

    по сравнению с:

    new Thread(runnable).start()
    
  2. Если Callable не является длинным и никогда не будет запущено более одного экземпляра, можно ли использовать код из (1)? Или лучше иметь ExecutorService в качестве статического экземпляра и повторно использовать между вызовами?

  3. Если у меня есть несколько задач, как описано в (2), есть ли проблемы с каждой задачей, связанной с наличием собственной службы исполнителя, или лучше иметь централизованную? (Я говорю о клиентском приложении, в котором обычно не выполняется более одной из этих задач)

  4. Какие ресурсы потребляет Executor, если он не выключен ()?

Ответы [ 2 ]

6 голосов
/ 24 августа 2011

Есть ли штраф за использование

ExecutorService e=Executors.newSingleThreadExecutor();
e.execute(callable)
e.shutdown()

по сравнению с:

new Thread(runnable).start()

Да, есть "штраф"": ExecutorService, скорее всего, будет более дорогим в создании, поскольку он также создает очередь для задач, которые вы отправляете, и если поток завершает свою работу до завершения работы, то сбойный поток будет заменен другим для выполнениялюбые последующие задачи (так что там довольно много логики).Однако вы, вероятно, не хотите создавать ExecutiveService каждый раз, когда хотите запустить задачу ... это, вероятно, не лучшее использование ExecutorService (подробнее об этом в следующем вопросе).

Если Callable не длинный, и никогда не будет запущено более одного экземпляра, можно использовать код из -1-?Или лучше использовать ExecutorService в качестве статического и повторно использовать между вызовами?

Рекомендуемое использование ExecutorService в качестве пула потоков, где вы сохраняете ExecutorService и продолжаете отправлять задачидо тех пор, пока у вас есть задачи для отправки.Это может быть статический элемент или просто обычный член, который не имеет значения и сильно зависит от ваших требований / дизайна.Даже если вы запускаете только один экземпляр за раз (т.е. у вас есть только однопоточный исполнитель), все же более эффективно использовать ExecutorService, потому что он повторно использует поток, поэтому в долгосрочной перспективе он будет дешевлечем создание нового потока для каждой отправляемой вами задачи.

Если у меня есть несколько задач ... есть ли проблемы для каждой задачи, чтобы иметь службу исполнителя или лучше иметь централизованную?

Нет проблем, но это неэффективно, поэтому просто имейте централизованную службу исполнителя.

Какие ресурсы потребляет Исполнитель, если он не выключен ()?

Не думаю, что вам следует особенно беспокоиться об этом, особенно если вы используете Executor в правильном контексте, он будет минимальным.

0 голосов
/ 24 августа 2011

Задача ExecutorService состоит в том, чтобы разделить много задач среди фиксированного числа потоков. Создание службы ExecutorService для запуска одной задачи - это расточительные накладные расходы.

new Thread(runnable).start() всегда должно быть быстрее, чем создание ExecutorService, поскольку ExecutorService все равно просто создаст поток, но с дополнительными издержками на его отслеживание.

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