Я совершенно новичок в библиотеке jsr166y, и я написал подпрограмму, использующую библиотеку forkjoin, которая разделяет запрос и одновременно запускает его для реплик базы данных.Я поместил фрагмент ниже.SelectTask расширяет RecursiveTask.
ForkJoinExecutor fjPool;
Future queryResultsFut = null;
for (int i = 1; i <= lastBatchNum; i++) {
...
SelectTask selectMatchesRecursiveTask = new SelectMatchesTask(loadBalancer.getDao(), thisRuleBatch, queryResults);
queryResultsFut = fjPool.submit(selectMatchesRecursiveTask);
}
queryResultsFut.get();
Вызов метода get предназначен для блокировки родительского потока до тех пор, пока не будут возвращены все результаты запроса, так что обработка может начатьсяпо агрегированным результатам.
Теперь, спустя некоторое время работы в среде CI, я обнаружил, что это не всегда происходит.При медленной базе данных поток будет продолжен, даже если задачи все еще выполняются.Это кажется мне противоречащим документации, которую я прочитал.
Возможно, я поступаю неправильно?Должен ли я расширить ForkJoinTask вместо RecursiveTask?