Можно ли создавать несколько пулов потоков (ExecutorService)? - PullRequest
4 голосов
/ 04 июня 2010

Я создал несколько экземпляров ExecutorService в своем коде, обычно на каждой странице пользовательского интерфейса есть один экземпляр ExecutorService. Каждый экземпляр ExecutorService будет выполнять несколько потоков http get request.

private ExecutorService m_threadPool = Executors.newCachedThreadPool();

Это нормально делать?

Проблема, с которой я столкнулся, заключается в том, что иногда запросы http get получают код ответа -1 из вызова HttpURLConnection getResponseCode (). Я не знаю, вызвано ли это несколькими экземплярами пула потоков.

Спасибо.

Ответы [ 2 ]

3 голосов

ExecutorService per se - это просто еще один объект, поэтому нет больших накладных расходов. Но каждый пул потоков по умолчанию поставляется с несколькими незанятыми потоками, которые являются причиной значительного расхода ресурсов. Я бы предложил установить по умолчанию количество предварительно сгенерированных потоков в каждом пуле (1 или 0, если вы не уверены, отправляются ли какие-либо запросы), чтобы снизить стоимость создания дополнительных объектов. Потоки будут создаваться по требованию, и вы сможете поддерживать свой код в чистоте.

Другим решением является использование одного пула потоков, но для ведения отдельного списка задач для каждого окна пользовательского интерфейса. В этом случае, когда окно закрывается, вам придется перебирать все задачи и отменять выполняемые вручную (это также можно сделать в отдельном потоке). Задача может быть представлена ​​с помощью Future<?> (она имеет удобные методы isDone() и cancel()).

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

Это не должно быть вызвано вашими экземплярами пула потоков. Однако я бы сказал, что наличие более одного пула потоков сомнительно. Зачем вам это нужно? Это может привести к большому количеству ненужных потоков и, как следствие, к ненужному использованию памяти.

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