У меня есть класс, который использует ExecutorService для выполнения URL-запросов, чтобы они могли выполняться параллельно, и я ограничиваю его максимальным размером пула 20
private static ExecutorService getCachedPool(ThreadFactory threadFactory)
{
return new ThreadPoolExecutor(20, 20,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
threadFactory);
}
Однако я использую его следующим образом:
List<Future<ArtistCoverImage>> results = ArtistArtworkOnlineLookup.getExecutorService()
.invokeAll(lookups);
Но если я сделаю вызов, и поиск будет больше, чем доступный размер пула, он потерпит неудачу.Но я не понимаю этого, так как размер пула определяет только максимальные потоки, которые можно использовать, он использует SynchronousQueue , а не BlockingQueue , так почему дополнительные поиски не добавляются только вочередь.
Если я просто изменю на максимальный размер пула Integer.MAX_VALUE
private static ExecutorService getCachedPool(ThreadFactory threadFactory)
{
return new ThreadPoolExecutor(20, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
threadFactory);
}
, проблем не будет, но тогда я создаю гораздо больше пулов, чем хотелось бы.Это потенциальная проблема, потому что я пытаюсь улучшить производительность на маломощной машине черного ящика и пытаюсь минимизировать дополнительную работу.