Код сервлета выполняется в потоке. Этот поток порождается контейнером сервлета, который является Java-приложением, работающим в JVM.
После получения запроса контейнер сервлетов запускает поток, который выполняет код сервлета, и этот код получает входящий запрос для обработки. По завершении обработки этот поток попадает в пул или просто завершается в зависимости от того, как разрабатывается контейнер.
Преимущество состоит в том, что: порождение нового процесса является более дорогим (с точки зрения циклов памяти, ввода-вывода и процессора) для ОС, чем порождение потока внутри существующего процесса. Поток также разделяет пространство памяти с родительским процессом.
Темы могут быть объединены. Хотя создание потока обходится дешевле; безусловно, стоит заплатить за производительность; однако наличие пула потоков решает это в некоторой степени.
Еще один хороший момент наличия Threads - это элегантная обработка ошибок. Если поток возвращает ошибку, ее гораздо легче обработать, чем процесс, завершающийся с ошибкой.