0

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

2

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

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

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

1 ответ(ов)

0

Ответ: Когда говорят "по запросу" (per request), это значит, что при поступлении HTTP-запроса создаётся поток или извлекается из пула поток, чтобы обработать его. Один поток обрабатывает весь запрос. "Поток на подключение" (thread per connection) схож с этим, но поток используется для целого подключения, что может означать множественные запросы, а также значительное время бездействия между ними. Контейнеры сервлетов используют принцип "поток на запрос". Возможно, существуют реализации, предлагающие "поток на подключение", но мне о таких ничего не известно, и это, похоже, было бы довольно нерационально.

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

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь