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

5

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

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

Ваш Ответ

2   ответа
16

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

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

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

Is the thread created by startAsync somehow cheaper?

Нет созданной темыstartAsync! Он просто сообщает сервлет-контейнер:hey, although the doGet/doPost method finished, I am not done with this request, please do not close, В этом весь смысл - вы, вероятно,won't создать новый поток для каждого асинхронного запроса. Вот еще один пример - тысячи браузеров ожидают изменения цены акций, используя, В стандартных сервлетах это означало бы: тысячи свободных потоков, ожидающих какого-либо события.

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

Спасибо! Это имеет смысл :) Aivar
... но, к сожалению, для меня это пока не совсем понятно. Похоже, я запутался из-за примера, из которого я узнал AsyncContext. Я написал еще один вопрос по этому поводу, может быть, вы также можете посмотреть на это:stackoverflow.com/questions/10073392/… Aivar
4

With servlet 3.0 you can just keep all asynchronous requests waiting in an ArrayList or a some queue Проблема в этом. Вам все еще нужен новый поток для обработки запроса и получения запроса для окончательной отправки ответа. Таким образом, мы освобождаем потоки http, но должны создать какой-то поток для обработки запроса.

Похожие вопросы