Как распределяются потоки для обработки запросов Servlet?
Подскажите, пожалуйста, что такое "поток на запрос" и "поток на соединение"? На какой модели работают сервлеты? Как выделяются потоки для обработки HTTP-запросов? Это один поток на запрос или на соединение?
Допустим, я хочу выполнить долгий по времени процесс в методе doGet()
моего Servlet
асинхронно. Я создаю новый поток с использованием Java Executor, чтобы длительные вычисления выполнялись в отдельном потоке, и ответ отправляется сразу.
В этом случае гарантирует ли это, что я освободил поток, который обрабатывал мой HttpServletRequest
, или он все еще используется, потому что дочерний поток продолжает работать?
1 ответ(ов)
Ответ: Когда говорят "по запросу" (per request), это значит, что при поступлении HTTP-запроса создаётся поток или извлекается из пула поток, чтобы обработать его. Один поток обрабатывает весь запрос. "Поток на подключение" (thread per connection) схож с этим, но поток используется для целого подключения, что может означать множественные запросы, а также значительное время бездействия между ними. Контейнеры сервлетов используют принцип "поток на запрос". Возможно, существуют реализации, предлагающие "поток на подключение", но мне о таких ничего не известно, и это, похоже, было бы довольно нерационально.
Создание потока внутри другого потока не устанавливает никаких специальных отношений, и обычно такая практика нужна, чтобы один поток выполнил больше работы или завершился, в то время как другой поток продолжает работу. В вашем сценарии использование другого потока для выполнения задач, необходимых для обработки запроса, позволит, как вы и ожидаете, сразу же отправить ответ. Поток, обслуживающий этот запрос, также будет немедленно доступен для нового запроса, независимо от того, сколько времени займет выполнение работы в другом потоке. Это, по сути, и есть подход к выполнению асинхронной работы в контейнере сервлетов с принципом "поток на запрос".
Предостережение: Если вы находитесь в полном контейнере Java EE, управление потоками может осуществляться за вас таким образом, что создание своих собственных потоков может быть плохой идеей. В таком случае лучше попросить контейнер создать поток, но общие принципы остаются теми же.
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
В чем разница между JSF, Servlet и JSP?
Как заставить браузер скачать файл?
Что значит 'synchronized'?
Когда следует использовать поток Java вместо Executor?