У меня есть 5000 похожих вызываемых задач, которые должны быть выполнены в 8 потоках ExecutorService, созданных Executors.newFixedThreadPool (8).Каждая задача отправляется в базу данных для извлечения большого количества данных для обработки.
Все отлично работает 99% времени, НО иногда я вижу очень странные сообщения журнала выполнения в файле журнала, когда БД работает медленно или зависает (не спрашивайте, почему), и 8 выполняющихся в данный момент задач останавливаются и не работаютЗакончив еще во всех 8 потоках, ExecutorService начинает посылать больше задач для выполнения одну за другой!
Так что журнал показывает, что в какой-то момент ExecutorService сходит с ума и начинает вызывать метод call () Callable для все большего числа задач вочередь ожидания, не ожидая завершения предыдущих задач.Все больше и больше задач отправляют запросы в БД, что в итоге ставит БД на колени, и куча памяти Java исчерпывается.
Похоже, что-то странное происходит внутри ExecutorService, или мое понимание ситуации неверно.Кто-нибудь видел что-нибудь подобное?
Мой мозговой стек переполнен
ps - цитата из API Java:
Executors.newFixedThreadPool (int nThreads)
Создаетпул потоков, который повторно использует фиксированное число потоков, работающих в общей неограниченной очереди.В любой момент не более nThreads потоков будут активными задачами обработки.Если дополнительные задачи отправляются, когда все потоки активны, они будут ждать в очереди, пока поток не станет доступным. Если какой-либо поток завершается из-за сбоя во время выполнения перед завершением работы, при необходимости для выполнения последующих задач его место занимает новый. .
Может ли это произойти на самом деле, если мои задачизаставить поток умирать, и ExecutorService создает больше потоков и отправляет им новые 8 задач, и они умирают, а ExecutorService создает еще 8 потоков и отправляет больше 8 задач?
pss: вся операция внутри call () Callable окруженас try catch, так что если в моей работе происходит какое-либо исключение, то оно будет записано и зарегистрировано.Ничего этого не происходит.Вызов вызывается и просто никогда не возвращается, в то время как следующие задачи выполняются по очереди, одна за другой, никогда не возвращаются и никогда не завершаются и никогда не выдают никаких исключений.
Я подозреваю, что мои задачи приводят к смерти потоков в пуле потоков.Как можно подражать?