Я хотел бы использовать пул потоков для обработки списка элементов, а затем дождаться их завершения. Я также должен иметь возможность таймаутировать его после 4-минутной обработки, если они еще не закончены.Вилка и присоединение без основной темы
Это то, что я в данный момент
ForkJoinPool threadPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
list.forEach(entry -> threadPool.execute(() -> {
// processing
}));
if (!threadPool.awaitQuiescence(4, TimeUnit.MINUTES)) {
// send alert about delay
}
Проблема заключается в том, что иногда этот подход будет использовать основной поток для обработки одного из элементов списка, означающих, что awaitQuiescence не начнется до тех пор, после того, что один завершает , Есть ли другой пул потоков, который позволяет что-то подобное, но гарантирует не использовать основной поток или есть способ настроить ForkJoinPool?
Почему бы просто не выполнить его в новой теме? И «иногда это будет выполняться в основном потоке» на самом деле не имеет смысла. Вы говорите, что результаты непоследовательны, так как в 'ForkJoinPool' выбирает, использовать ли основной поток или нет? –
ForkJoinPool кажется непоследовательным. Я регистрируюсь в процессе обработки, который записывает используемый поток, и иногда он использует только те, которые называются ForkJoinPool-1-worker- [n], а другие - один из тех, которые его вызвали. – sparkdoo
Невозможно избежать использования подающей нити. Подающая нить необходима для достижения приемлемого уровня производительности с предостережением, как я указываю здесь: http://coopsoft.com/ar/Calamity2Article.html#submit – edharned