Може ли 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

Мисля, че трябва да използвате Семафор вместо invokeAll()

person Dennis C    schedule 27.11.2008