Estou correto ao dizer que, para aplicativos da Web, o contêiner da web cuida da multithreading?
A maioria dos servidores da Web (Java e outros, incluindo o JBoss) segue um modelo "um thread por solicitação", ou seja, cada solicitação HTTP é totalmente processada por exatamente um thread. Esse encadeamento geralmente passa a maior parte do tempo aguardando itens como solicitações de banco de dados. O contêiner da web criará novos threads conforme necessário.
Alguns servidores (no ecossistema Java principalmente Netty ) fazem tratamento de solicitações assíncronas, com um modelo "um thread faz tudo" ou algo mais complexo. A idéia básica é que ter muitos threads em espera desperdiça recursos, portanto, trabalhar de forma assíncrona pode ser mais eficiente.
Em caso afirmativo, posso introduzir novos passos em aplicativos baseados na Web?
É possível, mas deve ser feito com muito cuidado, pois erros (como vazamento de memória ou falta de sincronização) podem causar bugs que são muito difíceis de reproduzir ou derrubar todo o servidor.
Existe alguma vantagem em fazer isso e em que cenário seria necessário fazer isso?
Bem, a vantagem é que você pode fazer coisas em paralelo. Usar threads para melhorar a velocidade computacional pura é algo que você não deve fazer em um servidor da Web, pois isso atrasaria o processamento de outras solicitações. Esse tipo de coisa deve ser feito em um servidor separado, provavelmente usando algum tipo de fila de trabalhos.
Um cenário legítimo para multithreading no contexto de manipulação de uma solicitação HTTP pode ser se você precisar acessar outros recursos de rede, por exemplo, chame vários serviços da web diferentes. Se você fizer isso de uma só vez, precisará aguardar que cada chamada termine sucessivamente. Mas se você usar vários encadeamentos, o tempo total de espera será apenas o atraso da chamada mais lenta.
Concurrency Utilities
.