Я пытаюсь создать многопоточное приложение в Java с использованием пулов потоков ExecutorService. Приложение в основном запрашивает стороннюю службу для данных о данном ключевом слове. Поскольку у меня много ключевых слов, и каждый запрос занимает некоторое время, чтобы сгенерировать, я хотел бы запросить службу параллельно. Запросы выполняются через объект ServiceHandler, который выполняет проверку подлинности и анализирует результаты.Доля объектов между задачами в пуле потоков, но не между потоками в Java
В моей первоначальной реализации я создаю новый Callable для каждого ключевого слова и создаю новый объект ServiceHandler для запроса службы. По какой-то причине это выполняется быстрее, чем совместное использование одного объекта ServiceHandler во всех Callable. Однако, с большими наборами входных данных, я сталкиваюсь с проблемами памяти, потому что он создает новые объекты для каждого ключевого слова ввода.
Есть ли способ использовать ExecutorService, но только создать отдельный экземпляр ServiceHandler для каждого рабочего потока? Например, если у меня есть 1000 ключевых слов и фиксированный пул из 20 потоков, я хочу создать только один ServiceHandler для каждого потока (всего 20), в то же время имея по одному Callable для каждого ключевого слова (всего 1000).
Я попытался добавить статический объект ThreadLocal к каждому вызываемому объекту, который возвращает новый ServiceHandler в свой initialValue(), но создается впечатление, что создается только один ServiceHandler? Я могу опубликовать свой код для этого, но я даже не уверен, что это правильный подход.
Я попробовал это и добавил новую статическую изменчивую переменную instanceCount в ServiceHandler. Когда я увеличиваю эту переменную в конструкторе ServiceHandler и распечатываю ее, я всегда получаю 1, что похоже на то, что я создаю только один экземпляр? – Yiling