Правильно ли я сказал, что для веб-приложений веб-контейнер заботится о многопоточности?
Большинство веб-серверов (Java и другие, включая JBoss) следуют модели «один поток на запрос», т.е. каждый HTTP-запрос полностью обрабатывается ровно одним потоком. Этот поток часто проводит большую часть времени в ожидании таких вещей, как запросы БД. Веб-контейнер будет создавать новые темы по мере необходимости.
Некоторые серверы (в Java-экосистеме, в первую очередь Netty ) выполняют асинхронную обработку запросов, либо с моделью «один поток делает все», либо с чем-то более сложным. Основная идея заключается в том, что большое количество ожидающих потоков приводит к бесполезной трате ресурсов, поэтому асинхронная работа может быть более эффективной.
Если да, могу ли я представить новые протекторы в веб-приложениях?
Это возможно, но должно быть сделано очень осторожно, так как ошибки (такие как утечки памяти или отсутствие синхронизации) могут привести к ошибкам, которые очень трудно воспроизвести, или могут повредить весь сервер.
Есть ли какое-то преимущество в этом, и в каком сценарии это нужно сделать?
Ну, преимущество в том, что вы можете делать вещи параллельно. Использование потоков для улучшения чистой вычислительной скорости - это то, что вы не должны делать на веб-сервере, так как это замедлит обработку других запросов. Подобные вещи должны выполняться на отдельном сервере, возможно, с использованием какой-либо очереди заданий.
Допустимый сценарий многопоточности в контексте обработки HTTP-запроса может быть, если вам нужен доступ к другим сетевым ресурсам, например, для вызова нескольких различных веб-служб. Если вы делаете это за один раз, вам придется ждать, пока каждый вызов не завершится по очереди. Но если вы используете несколько потоков, общее время ожидания - это только задержка одного самого медленного вызова.
Concurrency Utilities
.