У меня есть веб-сервис, который выполняет несколько небольших вычислений, прежде чем вернуть результат. Я хочу использовать ExecutorService
, предоставляемый Executors.newFixedThreadPool()
, как способ реализации шаблона Master-Worker (т.е. вызвать invokeAll
и позволить потоку дождаться завершения всех результатов). В идеале все потоки веб-службы используют одну и ту же службу-исполнитель, чтобы им всем не приходилось создавать собственный пул потоков, и они могли бы просто совместно использовать один большой пул, который использует все время обработки системы.
Вопросы, которые у меня есть с этим подходом:
- безопасно ли обращаться к функции
invokeAll
из нескольких потоков. - будет ли служба-исполнитель просто последовательно обрабатывать запросы (т. е. сначала все задачи из потока 1, затем задачи для потока
- есть ли способ иметь, скажем, 10 рабочих потоков и максимальное количество доступных потоков зависит от количества поступающих запросов, поэтому, скажем, у нас есть 1 запрос, он использует все 10 потоков для этого запроса. Если у вас есть 2 запроса, он разделяет их на 5 потоков на запрос и т. д.