Может ли java fixedThreadPool использоваться несколькими потоками - PullRequest
1 голос
/ 27 ноября 2008

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

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

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

Ответы [ 3 ]

2 голосов
/ 27 ноября 2008

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

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

1 голос
/ 27 ноября 2008

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

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

0 голосов
/ 27 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...