Мне нужно иметь глобальный пул потоков в моей системе для обработки заказов клиентов. Система основана на tomcat и должна принимать запросы клиентов 24/7. Я использовал ThreadPoolExecutor следующим образом:
private ThreadPoolExecutor exec = new ThreadPoolExecutor(100, 1000, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue());
Но иногда моя система зависает с исключением: «OutOfMemory: невозможно создать новый собственный поток». Итак, вопросы: 1. Будут ли все отправленные потоки постоянно находиться в пуле до его закрытия? 2. Что я должен использовать для создания пула потоков, который может повторно использовать или очищать завершенные задачи, чтобы он никогда не зависал?
Я также добавил сообщение журнала перед pool.submit:
logger.info("Active count: "+pool.getActiveCount()+" completed: "+pool.getCompletedTaskCount());
Но активное количество всегда равно нулю. Почему? Java-версия — openJDK 8 на FreeBSD.