Может ли java fixedThreadPool использоваться несколькими потоками

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

Вопросы, которые у меня есть с этим подходом:

  • безопасно ли обращаться к функции invokeAll из нескольких потоков.
  • будет ли служба-исполнитель просто последовательно обрабатывать запросы (т. е. сначала все задачи из потока 1, затем задачи для потока
  • есть ли способ иметь, скажем, 10 рабочих потоков и максимальное количество доступных потоков зависит от количества поступающих запросов, поэтому, скажем, у нас есть 1 запрос, он использует все 10 потоков для этого запроса. Если у вас есть 2 запроса, он разделяет их на 5 потоков на запрос и т. д.

person Linor    schedule 27.11.2008    source источник


Ответы (3)


При работе на сервере Java EE не следует создавать потоки самостоятельно. Я понимаю, что это не очень хорошая ситуация, поэтому вам следует изучить альтернативы в зависимости от используемого вами сервера приложений. Если это WebSphere или Weblogic, следует использовать WorkManager. спецификации commonj, которая обеспечивает именно ту функциональность, которую вы хотите. Также существует реализация для JBoss.

В качестве крайней меры следует рассмотреть возможность создания собственных потоков в управляемой среде.

person Robin    schedule 27.11.2008

Я бы сказал, не используйте invokeAll. Пусть каждый запрос вызывает ExecutorService.submit для каждой из подзадач, которые вы хотите выполнять параллельно. Пул потоков будет обрабатывать планирование задач (вот для чего он предназначен!).

И да, если вы используете Executors.newFixedThreadPool(), каждый запрос помещается в очередь, поэтому они обрабатываются последовательно.

person bajafresh4life    schedule 27.11.2008

Я думаю, вам следует использовать Семафор а не вызыватьВсе()

person Dennis C    schedule 27.11.2008