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