В моем проекте я создаю среду выполнения Java, которая получает рабочие запросы от клиента. Работа (разный размер) разбивается на набор задач и затем помещается в очередь для обработки. Существуют отдельные очереди для обработки каждого типа задачи, и каждая очередь связана с ThreadPool. ThreadPools настроены таким образом, что общая производительность двигателя оптимальна.Work/Task Stealing ThreadPoolExecutor
Эта конструкция помогает нам эффективно загружать баланс, а большие запросы не приводят к зависанию системных ресурсов. Однако время от времени решение становится неэффективным, когда некоторые из очередей пустые и их соответствующие пулы потоков сидят без дела.
Чтобы сделать это лучше, я думал о внедрении техники кражи работы/задачи, чтобы тяжело загруженная очередь могла получить помощь от других ThreadPools. Однако для этого может потребоваться реализация моего собственного Executor, поскольку Java не позволяет связать несколько очередей с ThreadPool и не поддерживает концепцию кражи работы.
Читайте о Fork/Join, но это не похоже на мои потребности. Любые предложения или альтернативный способ создания этого решения могут быть очень полезными.
Благодаря Энди
Вы должны думать о том, как держать все ваши процессоры занятыми. Неважно, если некоторые из ваших потоков простаивают, если вы лучше всего используете свои процессоры. –
Если в ваших пулах потоков столько потоков, сколько у вас есть, любой отдельный пул потоков может «украсть» весь процессор, даже если все остальные пулы потоков простаивают. –
@PeterLawrey - это правда, но если есть много пулов, то у вас может быть низкая производительность, если все потоки во всех пулах работают одновременно. – jtahlborn