Зачем создавать новый поток с помощью startAsync вместо выполнения работы в потоке сервлета?

В сервлете 3.0 можно использовать startAsync, чтобы поместить длинную работу в другой поток, чтобы вы могли освободить поток сервлета.

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


person Aivar    schedule 08.04.2012    source источник


Ответы (2)


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

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

В сервлете 3.0 вы можете иметь тысячи подключенных клиентов с несколькими потоками HTTP. Вы можете найти реальный пример в моей статье: Десятикратное увеличение в пропускной способности сервера с асинхронной обработкой Servlet 3.0, вдохновленной этим вопросом: ограничить пропускную способность/скорость загрузки файла в Servlet

Является ли поток, созданный startAsync, как-то дешевле?

Нет тем, созданных startAsync! Он просто сообщает контейнеру сервлета: эй, хотя метод doGet/doPost завершен, я еще не закончил с этим запросом, пожалуйста, не закрывайте. В этом весь смысл - вы, вероятно, не будете создавать новый поток для каждого асинхронного запроса. Вот еще один пример: у вас есть тысячи браузеров, ожидающих изменения курса акций, используя комета. В стандартных сервлетах это означало бы: тысячи бездействующих потоков, ожидающих некоторого события.

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

person Tomasz Nurkiewicz    schedule 08.04.2012
comment
... но, к сожалению, для меня это еще не совсем ясно. Похоже, я запутался из-за примера, из которого я изучил AsyncContext. Я написал еще один вопрос по этому поводу, возможно, вы также могли бы посмотреть на это: 0" title="какова цель запуска асинхронного контекста в сервлете 3 0"> stackoverflow.com/questions/10073392/ - person Aivar; 09.04.2012

С сервлетом 3.0 вы можете просто держать все асинхронные запросы в ожидании в ArrayList или некоторой очереди Проблема в следующем. Вам по-прежнему нужен новый поток для обработки запроса и получения запроса, чтобы, наконец, отправить ответ. Таким образом, мы освобождаем потоки HTTP, но должны создать поток для обработки запроса.

person shashank    schedule 18.10.2012