Как распределяются потоки для обработки запроса Servlet?

Может кто-нибудь объяснить, что такое поток на запрос и поток на соединение? На какой модели работают сервлеты? Как потоки распределяются для обработки HTTP-запросов? Это поток/запрос или соединение?

И позвольте сказать, что если я хочу выполнить трудоемкую задачу в моем методе Servlet doGet() асинхронно, я запускаю новый поток с использованием исполнителей Java, чтобы длительные вычисления выполнялись в отдельном потоке, и ответ сразу отправляется.

Теперь это гарантирует, что я освободил поток, который обрабатывал мой HttpServletRequest, или он все еще используется, потому что дочерний поток все еще запущен?

Ответ 1

В запросе означает, что когда выполняется HTTP-запрос, поток создается или извлекается из пула для его обслуживания. Один поток обслуживает весь запрос. Поток на одно соединение будет одним и тем же, за исключением того, что поток используется для всего соединения, которое может быть несколькими запросами и может также иметь много мертвого времени между запросами. Контейнеры сервлетов являются потоками для каждого запроса. Могут быть некоторые реализации, которые предлагают поток для каждого соединения, но я не знаю, и кажется, что это было бы очень расточительно.

Создание потока внутри другого потока не устанавливает каких-либо особых отношений, и в большинстве случаев это делается в том случае, если один поток больше работает или завершается, пока другой поток продолжает работать. В вашем сценарии использование другого потока для выполнения работы, требуемой запросом, будет, как вы ожидаете, позволить немедленно отправить ответ. Поток, используемый для обслуживания этого запроса, также будет немедленно доступен для другого запроса, независимо от того, сколько времени займет ваш другой поток. Это в значительной степени способ выполнения асинхронной работы в контейнере сервлетов потока за запрос.

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