Вопрос-ответ

Why is spawning threads in Java EE container discouraged?

Почему не рекомендуется создавать потоки в контейнере Java EE?

Одна из первых вещей, которые я узнал о разработке Java EE, это то, что я не должен создавать свои собственные потоки внутри контейнера Java EE. Но когда я начинаю думать об этом, я не понимаю причины.

Можете ли вы внятно объяснить, почему это не рекомендуется?

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

Итак, если действительно не следует создавать потоки, каков правильный способ сделать это при необходимости?

Переведено автоматически
Ответ 1

Это не рекомендуется, потому что все ресурсы в среде предназначены для управления и, возможно, мониторинга сервером. Кроме того, большая часть контекста, в котором используется поток, обычно привязана к самому потоку выполнения. Если вы просто запустите свой собственный поток (что, я полагаю, некоторые серверы даже не разрешат), он не сможет получить доступ к другим ресурсам. Это означает, что вы не можете получить InitialContext и выполнять поиск JNDI для доступа к другим системным ресурсам, таким как фабрики соединений JMS и источники данных.

Есть способы сделать это "правильно", но это зависит от используемой платформы.

Commonj WorkManager является общим для WebSphere и WebLogic, а также других

Подробнее здесь

И здесь

Также в чем-то дублирует этот из сегодняшнего утра

ОБНОВЛЕНИЕ: Пожалуйста, обратите внимание, что этот вопрос и ответ относятся к состоянию Java EE в 2009 году, с тех пор ситуация улучшилась!

Ответ 2

Для EJBS это не только не рекомендуется, но и прямо запрещено спецификацией:


Корпоративный компонент не должен использовать примитивы синхронизации потоков для синхронизации выполнения нескольких экземпляров.


и


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


Причина в том, что EJB предназначены для работы в распределенной среде. EJB может быть перемещен с одной машины в кластере на другую. Потоки (а также сокеты и другие ограниченные возможности) являются значительным препятствием для такой переносимости.

Ответ 3

Причина, по которой вы не должны создавать свои собственные потоки, заключается в том, что они не будут управляться контейнером. Контейнер выполняет множество функций, которые начинающему разработчику может быть трудно представить. Например, такие вещи, как объединение потоков, кластеризация, аварийное восстановление, выполняются контейнером. При запуске потока некоторые из них могут быть потеряны. Также контейнер позволяет перезапустить ваше приложение, не влияя на JVM, на которой оно работает. Как это было бы возможно, если потоки находятся вне контроля контейнера?

Именно по этой причине в J2EE 1.4 были введены службы таймера. Подробности смотрите в этой статье.

Ответ 4

Утилиты параллелизма для Java EE

Теперь существует стандартный и правильный способ создания потоков с помощью основного Java EE API:

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

Примеры здесь

java multithreading jakarta-ee